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

时间:2018-03-02 14:35:52

标签: c++ string concatenation overloading

我知道两个std::string的{​​{1}}的{​​{3}}没有超载。因此,

const char*

不起作用;然而,以下代码完美无缺。

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

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

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

两个std::string str = "Hello" " World"; 没有operator +的技术原因是什么?

3 个答案:

答案 0 :(得分:6)

没有这样的运营商的技术原因集中在所有权(拥有此运营商?const char*,全局命名空间或其他东西),添加两个"Hello" + " World"指针的事实毫无意义,其他问题围绕只读NUL终止字符文字的属性。

+对将要分配的内容一无所知。使用const char[]要求const char*字面值衰减+指针。添加两个指针完全没有意义,因此现代编译器将发出一个诊断,指出const char[]类型没有定义"Hello" " World"

hello + " World"是C-idiomatic字符串文字串联语法。自20世纪70年代以来一直存在,并且当每行代码只能看到80个左右的字符时,帮助民间写长字符串。

+正在使用std::string上的重载 hello运算符。这是因为std::stringstd::string str = "Hello"s + " World";

从C ++ 14开始,你可以利用

利用用户定义的文字
std::string str = ""s + "Hello" + " World";

甚至

s

请注意后缀$('div.article.article_rubric_top,div.article.article_top.article_right').find('a:first')

答案 1 :(得分:1)

  

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

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

这是来自语言。如果你问为什么库编写者没有提供这样的重载 - 你不能覆盖内置类型的操作符,只能用于用户定义的操作符。字符串文字和php artisan down都不是用户定义的。

答案 2 :(得分:0)

  

我知道stad :: string的operator +没有为两个const char *重载。

这种期望就像你为+类写Obj作为参数obj1obj2。然后说1+5不会使您的运营商过载。当然这里没有涉及Obj课程。

部分

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

有效,因为运算符涉及来自herestd::string重载4。

最后,"Hello" " World"没有任何结论。这就像在一个单独的部分写一个字符串。这有助于你用两行写一个长句。