在 C++ 中使用 "+" 连接字符串

concatenating strings using "+" in c++

本文关键字:字符串 连接 C++      更新时间:2023-10-16

我是一个c++新手,我指的是加速c++。在做其中一个练习题的时候上面写着:

Are the following definitions valid? Why or why not?
const std::string exclam = "!";
const std::string message = "Hello" + ", world" + exclam;

当我尝试&执行程序,我得到一个错误:

二进制操作符+.类型的无效操作数

但是下面的代码工作得很好:

const std::string hello = "Hello";
const std::string message = hello + ", world" + "!";

我不清楚它的执行!为什么第一种情况下的连接不起作用?

谢谢!

第一个表达式

"Hello" + ", world"

编译器需要找到一个合适的函数,比如operator+(const char *, const char *)。不存在这样的函数,因此无法编译。

相反,

hello + ", world"

正在寻找一个匹配的operator+(const std::string&, const char*),并且该过载不存在(它由std::string提供)。


请注意,即使你可以编写你自己的重载:

std::string operator+ (const char *left, const char *right)
{
    return std::string(left) + right;
}

(你不能,正如Praetorian指出的那样)这不是一个好主意。

首先,使用原始参数,您将失去ADL(即,如果标准库将操作符放在命名空间std中,它通常不会在外部可见)。

其次,如果你有其他的库,它们都有自己的字符串表示(例如:在stl之前的东西,如RogueWave或Qt等),它们同样有理由为它们的字符串类型提供重载,编译器将无法在它们之间进行选择。

这是因为当编译器读取它时,"Hello"不是std::string,而是const char * -这意味着您不能将其用于+

你可以简单的修改:

 const std::string message = std::string("Hello") + ... 

"Hello"不是字符串,因为它不是std::string类型的对象。它是一个字符串字面值,它是一个字符数组。不能用+连接两个字面值,但可以用数组连接std::string(反之亦然)。

"Hello" + ", world" + exclam相当于("Hello" + ", world") + exclam,因此不起作用,因为它试图连接两个字面值。但是,您可以不使用+操作符将它们连接起来:"Hello" ", world" + exclam

hello + ", world" + "!";相当于(hello + ", world") + "!"。它将一个std::string与一个字面量连接起来;结果是一个新的std::string,然后与第二个字面值连接。两种连接方式都是允许的

原因是c++是一个在过去半个世纪左右缓慢发展的语言家族的成员,并且在边缘仍然有古代语言的残余。

第一个示例中的"Hello"", world"是const char*对象。由于指针的性质,没有定义将两个字符数组添加到一起的方法,尽管从逻辑上看这似乎很好。

在第二个例子中,hello是一个std::string对象,它定义了一个+操作符,这样当你写:

hello + ", world"

它创建一个新的std::string对象,其中包含两个内容。