似乎<
#include <string>
#include <iostream>
using namespace std;
int main() {
string string1 = "C";
string string2 = "D";
cout << "A" "B"; //This compiles and outputs "AB"
cout << string1 string2; //This doesn't compile
return 0;
}
如注释中所述,行
cout << "A" "B";
编译并输出“ AB”。这两个字符串文字似乎存在某种隐式连接。但是下一行不会编译。这似乎表明出于某种原因缺少相同的隐式连接。为何编译器将这两行区别对待?如果它是连接字符串文字,那么它不应该也连接字符串变量吗?
隐式发生了什么,为什么字符串文字和变量都没有发生?
编辑:似乎确实接近链接的可能重复的问题,但那个问题问“为什么这种行为(语言文字的隐式连接)在语言中?”而我的问题是:“为什么要用字符串文字而不是字符串变量来完成。
最佳答案
字符串文字的串联实际上发生在编译时,实际上是在编译过程的早期,而std::string
的串联需要生成代码,该代码调用std::string
(std::basic_string<T>::operator+
)上的重载运算符。字符串文字的连接是一种表面级别的语法功能,可以在基于C的语言中在分词化之上进行处理。它来自C,不是C ++,C最初甚至没有在其库中使用自动内存分配进行字符串连接。
(对以下情况进行的低级调用很有启发性:
std::string a("a");
std::string a("b");
auto foo = a + b;
auto bar = a + "b";
auto baz = std::string("a") + b;
)
使用
constexpr
,即使使用std::string
,也可以在编译时评估常量字符串的连接,但是应该感谢所有涉及此操作的机制,当然,其中的一部分只是C ++的新增功能。为了使C ++支持在
std::string
上透明建议的连接类型,必须能够重载“空白运算符”。请参阅以下愚人节提案:http://www.stroustrup.com/whitespace98.pdf。关于c++ - 为什么可以串联2个字符串文字而不是两个字符串变量?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46820423/