C++ 为什么可以';将concat 2 const char*转换为std::string?

C++ 为什么可以';将concat 2 const char*转换为std::string?,c++,string,concatenation,overloading,C++,String,Concatenation,Overloading,我知道forstd::string对于两个const char*没有重载。因此, std::string str = "Hello" + " World"; 不起作用;然而,下面的代码可以完美地工作 std::string hello = "Hello"; std::string str = hello + " World"; 此外,静态字符串连接(不带+运算符)也可以很好地工作 std::string str = "Hello" " World"; 没有for twoconst cha

我知道for
std::string
对于两个
const char*
没有重载。因此,

std::string str = "Hello" + " World";
不起作用;然而,下面的代码可以完美地工作

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

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

没有for two
const char*
的技术原因是什么?

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

“Hello”+“World”
不知道它将被分配给什么。使用
+
需要
常量字符[]
文本衰减为
常量字符*
指针。添加两个指针毫无意义,因此现代编译器将发出一个诊断,说明
+
没有为
常量字符[]
类型定义

“Hello”“World”
是C语言惯用的字符串文字连接语法。这是从20世纪70年代开始的,它帮助人们在每行代码中只有80个左右的字符时编写长字符串

hello+“World”
正在
std::string
上使用重载的
+
运算符。这是因为
hello
是一个
std::string


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

甚至

std::string str = ""s + "Hello" + " World";
注意后缀
s

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

< > C++中只为指针定义了某些类型的操作-从/指向指针的加减值,从另一个指针中减去指针。没有定义向指针添加指针,因为它没有任何意义。Char指针在这个意义上与其他指针没有区别,并且没有可行的解决方案为
const Char*
提供这种异常,因为它在一般情况下不起作用。它只能用于字符串文本,但需要构造来连接语言中已有的字符串文本

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

我知道std::string的运算符+对于两个const char*没有重载

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

角色

std::string str = hello  + " World";
之所以有效,是因为运算符涉及
std::string
重载4


最后,
“Hello”“World”
不包含任何内容。这就像把一个字符串分成不同的部分。这有助于你把一个长句分成两行

1)正如您已经提到的,
运算符+
仅对
std::string
重写<代码>常量字符*不是
std::string
。2) “两个
常量字符*
没有
+运算符的技术原因是什么?”您不能覆盖内置类型的运算符。@schorsch312技术原因是只允许对用户定义的类型使用运算符重载。字符串串联(
“Hello”“World”
)在编译时完成。+运算符的调用仅在运行时完成。但请注意,以下操作有效
“Hello”s+“world”
(需要
使用std::string_literals
)。这不是技术原因,而是设计原因:添加指针毫无意义。“然后在无效上下文中添加两个指针,这会使程序处于未定义状态!“这是一个奇怪的说法。添加2个指针根本不被定义为操作,那么它怎么能将您的程序置于未定义状态?当您可以添加2个指针时,是否存在有效的上下文?@Slava:我刚刚向社区证明,我是预标准化C.Oops的遗物,并已更正。
std::string str = hello  + " World";