为什么我不能将 2 个常量字符* 连接到 std::string?

Why can't I concat 2 const char* to a std::string?

本文关键字:连接 std string 字符 不能 常量 为什么      更新时间:2023-10-16

我知道运算符 + forstd::string在两个const char*没有重载。因此

std::string str = "Hello" + " World";

不起作用;然而,以下代码运行良好。

std::string hello = "Hello";
std::string str = hello  + " World";

此外,静态字符串连接(没有+运算符)也可以正常工作

std::string str = "Hello" " World";

两个const char*没有运算符+的技术原因是什么?

没有这样的运营商的技术原因集中在所有权上(什么会拥有这个运营商?std::string全局命名空间或其他东西),添加两个const char*指针这一事实毫无意义,以及其他问题集中在只读 NUL 终止字符文本的属性上。

"Hello" + " World"对它将要分配给什么一无所知。使用+需要const char[]文本衰减为const char*指针。添加两个指针根本没有意义,因此现代编译器将发出诊断,指出+未为const char[]类型定义。

"Hello" " World"是 C 惯用字符串文字串联语法。这自 1970 年代以来一直存在,当每行代码只有 80 个左右可见字符时,它可以帮助人们编写长字符串。

hello + " World"正在使用重载+运算符std::string。那是因为hello是一个std::string


从 C++14 开始,您可以使用

std::string str = "Hello"s + " World";

甚至

std::string str = ""s + "Hello" + " World";

请注意后缀s

两个常量字符*没有运算符+的技术原因是什么?

C++中,只有为指针定义的某些类型的操作 - 从/到指针添加/减去 intergal 值,从另一个指针中减去指针。未定义将指针添加到指针,因为它没有任何意义。从这个意义上讲,char 指针与任何其他指针没有什么不同,并且没有可行的解决方案可以为const char *提供此类异常,因为它在一般情况下不起作用。它只能用于字符串文字,但已经在语言中连接它们的构造。

这是来自语言。如果你问为什么库编写器不提供这种重载 - 你不能覆盖内置类型的运算符,只能覆盖用户定义的运算符。字符串文本和const char*都不是用户定义的。

我知道 std::string 的运算符 + 对于两个常量字符*没有重载。

这种期望就像你为Obj类编写+,将obj1obj2作为参数。然后说1+5不会使您的操作员超负荷。当然,这里不涉及Obj类。

零件

std::string str = hello  + " World";

工作是因为操作员从这里std::string过载 4 中。

最后,"Hello" " World"没有承认任何事情。这就像在单独的部分中编写一个字符串。这可以帮助您在两行中写一个长句子。