根据我的阅读,以下代码:
string aggregate = "give" + 'n';
应生成具有值的结果字符串:
“给定的”。
它反而产生垃圾。为什么不发生以下情况?
“give”通过构造函数转换为std :: string,该构造函数接受指向字符数组的指针。
调用带有std :: string和字符的'+'重载,返回一个新字符串。
我的理论基于this手册页。
现在,我听说如果运算符是类的成员,则重载运算符的第一个参数不是构造函数转换的候选者。我相信我在Koenig和Moo读过这篇文章。但是,在这种情况下,我理解'+'运算符是非成员重载。
我意识到这似乎是一种荒谬的过度复杂化,但我想知道 FOR SURE 当我编写代码时会发生什么。
答案 0 :(得分:6)
首先评估表达式"give" + 'n'
,将(int)'n'
添加到字符串常量"give"
的地址。该指针算术的结果被赋予字符串对象。不会引发错误,因为结果是const char*
类型。
您应该习惯于在=
右侧考虑实际分配之前发生的所有事情(或本例中的初始化)。
您需要以下内容:
// construct the string object first
std::string aggregate = "give";
// then append the character
aggregate += 'n';
或者,首先显式构建一个字符串对象:
std::string aggregate = std::string("give") + 'n';
答案 1 :(得分:4)
表达式左侧有std::string
这一事实与第一步无关:"give"
是const char[5]
,它会衰减为const char*
} 'n'
是char
,即整数类型。向指针添加整数只会添加到指针的地址。结果再次是const char*
类型,然后隐式转换为std::string
。
基本上,您的代码相当于:
const char* c = "a string" + 'n';
std::string s = c;
因此,要达到预期的效果,请尝试
std::string s = std::string("a string") + 'n';
答案 2 :(得分:2)
您将整数'n'添加到文字“给”的地址。
尝试使用:
string aggregate = "long string long string long string long string long string long string long string " + 'A';
这应该说明发生了什么。
答案 3 :(得分:1)
该代码不符合您的想法。
它需要字符串文字"give"
然后有效地降级为const char[5]
,然后将'n'
的整数值添加到该指针。然后它接受新的垃圾指针并尝试从中创建一个字符串。
您想要string aggregate = std::string("give") + 'n';