为什么我不能将两个const char*连接成std::string?

3
我知道对于两个const char*std::stringoperator +没有重载。因此,
std::string str = "Hello" + " World";

不起作用;而下面的代码可以完美运行。

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

此外,静态字符串连接(不使用+运算符)也可以很好地工作。
std::string str = "Hello" " World";

为什么两个 const char* 不能使用 operator + 进行运算,有什么技术原因吗?

7
  1. 如你所提到的,operator+ 只被重载用于 std::stringconst char* 不是 std::string
  2. “为什么没有为两个 const char* 定义一个 +perator 的技术原因是什么?” 你无法重载内置类型的运算符。
- Algirdas Preidžius
1
@schorsch312 技术原因是,运算符重载仅允许针对用户定义的类型。 - Vlad from Moscow
字符串连接("Hello" " World")是在编译时完成的。+操作符的调用仅在运行时完成。 - Jabberwocky
但请注意,以下代码需要使用 using std::string_literals 才能正确运行:"Hello"s + "world" - Konrad Rudolph
@schorsch312 为什么不写成 std::string str = "Hello"; str += " World" 呢? - Vlad from Moscow
显示剩余3条评论
3个回答

6
没有这样运算符的技术原因集中在所有权方面(该运算符应该由谁拥有?std :: string,全局命名空间还是其他东西),事实上添加两个const char *指针没有任何意义,以及其他围绕只读NUL结尾字符文字属性的问题。
"Hello"+" World"并不知道它即将分配给什么。使用+需要const char[]字面值退化为const char *指针。添加两个指针根本没有任何意义,因此现代编译器会发出诊断,指出const char []类型未定义+。
"Hello" " World"是C风格的字符串字面量连接语法。自20世纪70年代以来一直存在,并帮助人们在每行代码只能看到大约80个字符时编写长字符串。
hello +" World"使用了std :: string上重载的+运算符。这是因为hello是std :: string。
从C ++ 14开始,您可以利用用户定义的文字。
std::string str = "Hello"s + " World";

甚至可以。
std::string str = ""s + "Hello" + " World";

请注意后缀的 s

1
你正在一个无效的上下文中添加两个指针,这会使你的程序进入未定义状态!这是一个奇怪的说法。根本没有定义将2个指针相加的操作,那么它如何使你的程序进入未定义状态呢?是否存在有效的上下文,可以将2个指针相加? - Slava
@Slava:我刚刚向社区证明了我是来自于标准化 C 之前的时代的遗物。哎呀,还进行了修正。 - Bathsheba

1
在C ++中,指针只定义了某些类型的操作 - 从/到指针添加/减去整数值,从另一个指针中减去指针。将指针添加到指针未定义,因为它没有任何意义。在这方面,char指针与其他指针没有区别,在const char *提供这样的例外情况没有可行的解决方法,因为它在一般情况下不起作用。它只能适用于字符串文字,但是构造以连接它们已经在语言中了。这是来自语言的。如果您想知道为什么库编写者没有提供此类重载 - 您无法覆盖内置类型的运算符,只能覆盖用户定义的运算符。字符串文字和const char*都不是用户定义的。

0
我知道std :: string的操作符+未针对两个const char *进行重载。
这种期望就像你为Obj类编写将obj1和obj2作为参数的+。然后说1 + 5不会重载您的运算符。当然,此处未涉及Obj类。
部分
std::string str = hello  + " World";

这段代码之所以能够正常工作,是因为它使用了这里std::string重载4运算符。

最后,"Hello" " World"并没有连接任何内容。它就像是将一个字符串分成了两部分来写。这有助于你在两行中编写一句较长的语句。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接