为什么我不能将 2 个常量字符* 连接到 std::string?
Why can't I concat 2 const char* to a std::string?
我知道运算符 + 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
类编写+
,将obj1
和obj2
作为参数。然后说1+5
不会使您的操作员超负荷。当然,这里不涉及Obj
类。
零件
std::string str = hello + " World";
工作是因为操作员从这里std::string
过载 4 中。
最后,"Hello" " World"
没有承认任何事情。这就像在单独的部分中编写一个字符串。这可以帮助您在两行中写一个长句子。
- 连接和压缩标准::vector<std::字符串的最佳方法>
- 在线程 A 中创建一个 std::thread 对象,在线程 B 中连接
- 使用std::bind将Qt信号连接到插槽
- 为什么一个表达式中的 std::string 连接给出的结果与逐个字符不同的结果?
- 使用 C++11 在一行中连接两个 std::vector
- 在std :: string中连接字符串的选项
- 通过连接 QObject 来消费 std::future
- 从具有本地 std::thread 对象而不连接的函数退出
- 碰撞连接到通过STD ::数组
- 我应该使用运算符+=而不是运算符+来连接std::string吗?
- std::bad_alloc连接两个向量时
- 如何连接多个std::向量
- std::string和const char情况下的连接优先级
- 数据库连接池的原始指针或std::stack中的std::shared_ptr
- boost::bind在std::transform中连接字符串
- GCC如何连接多个c++ std::string变量
- 如何在结构体中连接std::is_same
- 需要连接std:string + WCHAR移动gcc代码到Visual c++ 2010
- 用于连接std::vector容器的可变模板函数
- 如何连接 std::string 和 int