根据我的阅读,以下代码:
string aggregate = "give" + 'n';
Run Code Online (Sandbox Code Playgroud)
应该生成具有值的结果字符串:
"给予".
它反而产生垃圾.为什么不发生以下情况?
"give"通过构造函数转换为std :: string,该构造函数获取指向字符数组的指针.
调用带有std :: string和字符的'+'重载,返回一个新字符串.
我的理论基础在这个手册页上.
现在,我听说如果运算符是类的成员,则重载运算符的第一个参数不是构造函数转换的候选者.我相信我在Koenig和Moo读过这篇文章.但是,在这种情况下,我理解'+'运算符是非成员重载.
我知道这似乎是一个可笑的过度复杂,但是我想知道肯定,当我写的代码发生了什么.
首先计算表达式"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)
事实上,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)