似乎<<运算符能够将两个字符串文字并排传输到cout,而它不能并排传输两个字符串变量,因为两个字符串文字是隐式连接而两个字符串变量不是。这是一个展示这个的代码示例:
#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”。这两个字符串文字似乎存在某种隐式连接。但下一行不编译。这似乎表明由于某种原因缺乏相同的隐式连接。
为什么编译器对这两行的处理方式不同?如果它连接字符串文字,它不应该连接字符串变量吗?
隐式发生了什么,为什么字符串文字和变量都没有发生?
编辑:它似乎接近链接的可能重复的问题,但该问题询问“为什么这种行为(字符串文字的隐式连接)在语言中?”而我的问题是,“为什么这是用字符串文字完成的,而不是字符串变量。答案 0 :(得分:2)
字符串文字的连接发生在编译时,事实上在编译过程的早期,而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
上透明地提出的连接类型,必须能够重载&#34;空格操作符。&#34;请参阅以下愚人节提案:http://www.stroustrup.com/whitespace98.pdf。