std :: string除char *外

时间:2019-07-15 07:32:02

标签: c++ stdstring

我试图了解如何将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 *不是类,并且没有加法运算符。

2 个答案:

答案 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::stringchar,可以将上述模板签名“解释”为

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*并传递给该函数。