我正在阅读 Koenig 的 Accelerated C++。他写道:“新的想法是我们可以使用 + 来连接一个字符串和一个字符串文字 - 或者,就此而言,两个字符串(但不是两个字符串文字)。
好吧,我想这是有道理的。现在到两个单独的练习来说明这一点。
以下定义是否有效?
const string hello = "Hello";
const string message = hello + ",world" + "!";
现在,我尝试执行上述操作并且成功了!所以我很高兴。
然后我试着做下一个练习;
const string exclam = "!";
const string message = "Hello" + ",world" + exclam;
这没有用。现在我明白这与你不能连接两个字符串文字的事实有关,但我不明白为什么我设法让第一个例子工作之间的语义差异(不是“,世界”和“! “ 两个字符串文字?这不应该不起作用吗?)但不是第二个。
原文由 Arthur Collé 发布,翻译遵循 CC BY-SA 4.0 许可协议
+
运算符具有从左到右的关联性,因此等效的括号表达式为:如您所见,首先“添加”了两个字符串文字
"Hello"
和",world"
,因此出现错误。连接的前两个字符串之一必须是
std::string
对象:或者,您可以强制第二个
+
通过括号表达式的该部分首先进行评估:It makes sense that your first example (
hello + ",world" + "!"
) works because thestd::string
(hello
) is one of the arguments to the+
. That+
is evaluated, the result is astd::string
object with the concatenated string, and that resultingstd::string
is then concatenated with the"!"
.至于 为什么 不能使用
+
连接两个字符串文字,这是因为字符串文字只是一个字符数组(aconst char [N]
其中N
是字符串的长度加一,用于空终止符)。在大多数情况下使用数组时,它会转换为指向其初始元素的指针。因此,当您尝试执行
"Hello" + ",world"
时,您真正想做的是将两个const char*
加在一起,这是不可能的(添加两个指针意味着什么在一起?),如果它是它不会做你想让它做的事情。请注意,您 可以 通过将它们彼此相邻来连接字符串文字;例如,以下两个是等价的:
如果您想将一个长字符串文字分成多行,这将很有用。但是,它们必须是字符串文字:这不适用于
const char*
指针或const char[N]
数组。