Art*_*llé 117 c++ string syntax concatenation operators
我正在阅读Koenig的Accelerated C++.他写道:"新的想法是我们可以使用+来连接字符串和字符串文字 - 或者就此而言,使用两个字符串(但不是两个字符串文字).
很好,我认为这是有道理的.现在进行两个单独的练习,意在阐明这一点.
以下定义是否有效?
const string hello = "Hello";
const string message = hello + ",world" + "!";
Run Code Online (Sandbox Code Playgroud)
现在,我尝试执行上述操作并且有效!所以我很高兴.
然后我试着做下一个练习;
const string exclam = "!";
const string message = "Hello" + ",world" + exclam;
Run Code Online (Sandbox Code Playgroud)
这没用.现在我明白它与你无法连接两个字符串文字的事实有关,但我不理解为什么我设法让第一个例子工作之间的语义差异(不是",世界"和"! "两个字符串文字?这不应该没用吗?"但不是第二个.
Jam*_*lis 133
const string message = "Hello" + ",world" + exclam;
Run Code Online (Sandbox Code Playgroud)
在+操作员已左到右结合,因此相当于括号表达式是:
const string message = (("Hello" + ",world") + exclam);
Run Code Online (Sandbox Code Playgroud)
正如你所看到的,两个字符串文字"Hello"和",world"是"补充"第一,因此错误.
连接的前两个字符串之一必须是一个std::string对象:
const string message = string("Hello") + ",world" + exclam;
Run Code Online (Sandbox Code Playgroud)
或者,您可以+通过括号表达该部分表达式来强制第二个进行求值:
const string message = "Hello" + (",world" + exclam);
Run Code Online (Sandbox Code Playgroud)
你的第一个example(hello + ",world" + "!")是有效的,因为std::string(hello)是最左边的参数之一+.即+进行评价时,其结果是std::string与串联的字符串对象,并且该所得std::string然后与级联"!".
至于为什么使用两个字符串文字不能连接+,这是因为一个字符串文字只是一个字符数组(const char [N]这里N是字符串的长度加一,对空终止).在大多数上下文中使用数组时,它将转换为指向其初始元素的指针.
所以,当你尝试做的时候"Hello" + ",world",你真正要做的就是将两个加const char*在一起,这是不可能的(将两个指针组合在一起是什么意思?)如果是这样就不会对你做什么了想要它做.
请注意,您可以通过将字符串文字放在彼此旁边来连接字符串文字; 例如,以下两个是等效的:
"Hello" ",world"
"Hello,world"
Run Code Online (Sandbox Code Playgroud)
如果您要将多个字符串文字拆分为多行,则此选项非常有用.但它们必须是字符串文字:这不适用于const char*指针或const char[N]数组.
你应该时刻注意类型.
虽然他们都看起来像琴弦,"Hello"并",world"有文字.
在你的例子中,exclam是一个std::string对象.
C++有一个运算符重载,它接受一个std::string对象并为其添加另一个字符串.当您将std::string对象与文字连接时,它将为文字进行适当的转换.
但是如果你尝试连接两个文字,编译器将无法找到一个带两个文字的运算符.
你的第二个例子不起作用,因为没有operator +两个字符串文字.请注意,字符串文字不是类型string,而是类型const char *.如果您像这样修改它,您的第二个示例将起作用:
const string message = string("Hello") + ",world" + exclam;
Run Code Online (Sandbox Code Playgroud)
从 C++14 开始,您可以使用两个真正的字符串文字:
const string hello = "Hello"s;
const string message = hello + ",world"s + "!"s;
Run Code Online (Sandbox Code Playgroud)
或者
const string exclam = "!"s;
const string message = "Hello"s + ",world"s + exclam;
Run Code Online (Sandbox Code Playgroud)