我试图了解如何将std :: string添加到char *中。 该代码正在按预期方式编译和运行:
#include <string>
#include <cstdio>
void func (const char* str) {
printf("%s\n", str);
}
int main () {
char arr[] = {'a','b','c',0};
char *str = arr;
func((str + std::string("xyz")).c_str()); // THIS LINE
return 0;
}
但是我不明白构造函数/方法在调用什么,以什么顺序工作。这是将std :: string添加到char *中,这又提供了另一个std :: string,但是char *不是类,并且没有加法运算符。
答案 0 :(得分:6)
您在左侧operator +
使用const char*
,在右侧使用临时std::string
。这是过载#4 here:
template< class CharT, class Traits, class Alloc > basic_string<CharT,Traits,Alloc> operator+( const CharT* lhs, const basic_string<CharT,Traits,Alloc>& rhs );
返回值
包含lhs字符和rhs字符的字符串
使用std::string
和char
,可以将上述模板签名“解释”为
std::string operator+ (const char* lhs, const std::string& rhs);
结果是一个新的临时std::string
对象,该对象拥有串联的新缓冲区"abcxyz"
。它可以绑定到类型为const char*
的函数参数,并且只要函数主体执行就有效。
答案 1 :(得分:1)
此行:
str + std::string("xyz")
调用以下运算符:
https://en.cppreference.com/w/cpp/string/basic_string/operator%2B
template< class CharT, class Traits, class Alloc >
basic_string<CharT,Traits,Alloc>
operator+(const CharT* lhs,
basic_string<CharT,Traits,Alloc>&& rhs );
并创建一个临时std::string
(有效期至完整语句结束),您可以在其上调用.c_str()
,并返回const char*
并传递给该函数。