为什么我可以构造一个包含多个字符串文字的字符串?

Tre*_*key 3 c++ string grammar concatenation string-literals

#include <iostream>
#include <string>

int main() {
    std::string str = "hello " "world" "!";
    std::cout << str;
}
Run Code Online (Sandbox Code Playgroud)

以下编译,运行和打印:

你好,世界!

看到了


似乎字符串文字被连接在一起,但有趣的是,这不能用以下方法完成operator +:

#include <iostream>
#include <string>

int main() {
    std::string str = "hello " + "world";
    std::cout << str;
}
Run Code Online (Sandbox Code Playgroud)

这将无法编译.
看到了


为什么这种行为在语言中?我的理论是允许字符串用多个#include语句构造,因为#include语句必须在它们自己的行上.由于语言的语法,这种行为是否可行,或者是为了帮助解决问题而添加的异常?

Sha*_*our 10

相邻的字符串文字是连接的,我们可以在草案C++标准部分2.2 的翻译阶段6段中看到这一点,它说:

相邻的字符串文字标记是连接的

在你的另一种情况下,没有运算符+定义为取两个*const char**.

至于为什么,这来自C,我们可以进入国际标准编程语言的基本原理-C,它在部分6.4.5 字符串文字中说:

通过使用反斜杠换行符续行,可以在多行中继续字符串,但这要求字符串的延续在下一行的第一个位置开始.为了允许更灵活的布局,并解决一些预处理问题(见§6.10.3),C89委员会引入了字符串文字串联.将一行中的两个字符串文字粘贴在一起,中间没有空字符,以构成一个组合字符串文字.对C语言的这种添加允许程序员将字符串文字扩展到物理行的末尾之外,而不必使用反斜杠换行机制,从而破坏程序的缩进方案.未引入显式连接运算符,因为连接是词法构造而不是运行时操作.

如果没有此功能,您必须执行此操作以在多行上继续字符串文字:

   std::string str = "hello \
world\
!";
Run Code Online (Sandbox Code Playgroud)

这很难看.


Jor*_*eit 7

就像@erenon所说的那样,编译器会将多个字符串文字合并为一个,如果你想使用多行代码,这将特别有用:

cout << "This is a very long string-literal, "
        "which for readability in the code "
        "is divided over multiple lines.";
Run Code Online (Sandbox Code Playgroud)

但是,当您尝试使用时将字符串文字连接在一起时operator+,编译器会抱怨,因为没有operator+为两个字符串定义char const *.运算符string类定义的(与C字符串完全不同),因此这样做是合法的:

string str = string("Hello ") + "world";
Run Code Online (Sandbox Code Playgroud)