std::string 添加到 char*

std::string addition to char*

我想了解将 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;
}

但我不明白 constructors/methods 调用的是什么以及它的工作顺序。这是 std::string 到 char* 的加法,得到另一个 std::string,但 char* 不是 class,它没有加法运算符。

您在左侧使用 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 );

Return value

A string containing characters from lhs followed by the characters from rhs

加上std::stringchar,上面的模板签名可以"interpreted"为

std::string operator+ (const char* lhs, const std::string& rhs);

结果是一个新的临时 std::string 对象,它拥有串联的新缓冲区 "abcxyz"。可以绑定const char*类型的函数参数,只要函数体执行就有效。

这一行:

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(),其中 return const char* 被传递给函数。