gpt4 book ai didi

c++ - 为什么可以连接 2 个字符串文字而不是两个字符串变量?

转载 作者:行者123 更新时间:2023-11-28 01:41:53 26 4
gpt4 key购买 nike

似乎 << 运算符能够将两个字符串文字并排传输到 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”。这两个字符串文字似乎存在某种隐式连接。但是下一行不会编译。这似乎表明由于某种原因缺少相同的隐式连接。

为什么编译器以不同的方式处理这两行?如果它是连接字符串文字,它不应该也连接字符串变量吗?

隐式发生了什么,为什么它没有同时发生在字符串文字和变量上?

编辑:它看起来确实接近链接的可能重复问题,但该问题询问“为什么这种行为(字符串文字的隐式连接)在语言中?”而我的问,“为什么这是用字符串文字而不是字符串变量完成的。

最佳答案

字符串文字的连接发生在编译时,实际上是在编译过程的早期,而 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com