在C++中使用'+'运算符将字符附加到字符串文字时会发生什么?

gon*_*lor 4 c++ string stl

根据我的阅读,以下代码:

string aggregate = "give" + 'n';
Run Code Online (Sandbox Code Playgroud)

应该生成具有值的结果字符串:

"给予".

它反而产生垃圾.为什么不发生以下情况?

  1. "give"通过构造函数转换为std :: string,该构造函数获取指向字符数组的指针.

  2. 调用带有std :: string和字符的'+'重载,返回一个新字符串.

我的理论基础在这个手册页上.

现在,我听说如果运算符是类的成员,则重载运算符的第一个参数不是构造函数转换的候选者.我相信我在Koenig和Moo读过这篇文章.但是,在这种情况下,我理解'+'运算符是非成员重载.

我知道这似乎是一个可笑的过度复杂,但是我想知道肯定,当我写的代码发生了什么.

mea*_*gar 6

首先计算表达式"give" + 'n',添加(int)'n'到字符串常量的地址"give".该指针算术的结果被赋予字符串对象.不会引发错误,因为结果是类型const char*.

=在实际赋值之前(或在这种情况下初始化),你应该习惯于思考正在发生的所有事情.

您需要以下内容:

// construct the string object first
std::string aggregate = "give";

// then append the character
aggregate += 'n';
Run Code Online (Sandbox Code Playgroud)

或者,首先显式构建一个字符串对象:

std::string aggregate = std::string("give") + 'n';
Run Code Online (Sandbox Code Playgroud)


Ale*_*ler 5

事实上,std::string表达式左侧有 a 对于第一步来说并不重要:"give"is aconst char[5]会衰减为 aconst char*并且'n'is a char,即整数类型。将整数添加到指针只是添加到指针的地址。结果再次为 类型const char*,然后隐式转换为std::string.

基本上,您的代码相当于:

const char* c = "a string" + 'n';
std::string s = c;
Run Code Online (Sandbox Code Playgroud)

所以,为了达到想要的效果,尝试一下

std::string s = std::string("a string") + 'n';
Run Code Online (Sandbox Code Playgroud)