2

I am a novice in C++ and i am referring Accelerated C++. While trying one of its exercise questions which says:

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

When i tried & executed the program i am getting an error as:

invalid operands of types to binary operator +.

But the following code works perfectly fine:

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

I am not clear with its execution! why this concatenation in the first case not working?

Thanks!I am using DEV C++.

4

4 回答 4

7

在第一个表达式中

"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(即,如果标准库将运算符放在 namespace 中std,它通常不会在外部可见)。

其次,如果您有其他库具有自己的字符串表示形式(例如 RogueWave 或 Qt 等 STL 之前的东西),他们同样有理由为其字符串类型提供重载,并且编译器将有没有办法在它们之间做出选择。

于 2013-05-15T15:56:27.033 回答
3

这是因为"Hello"is not,当编译器读取它时,a std::string, but const char *- 这意味着你不能将它用于+.

您可以使用以下方法轻松修复它:

 const std::string message = std::string("Hello") + ... 
于 2013-05-15T15:54:46.037 回答
1

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

"Hello" + ", world" + exclam等价于("Hello" + ", world") + exclam, 所以不起作用,因为它试图连接两个文字。但是,您可以在没有+运算符的情况下连接它们:"Hello" ", world" + exclam

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

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

于 2013-05-15T15:58:59.847 回答
0

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

在第二个示例中, hello 是一个 std::string 对象,它定义了一个 + 运算符,以便在您编写时:

hello + ", world"

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

于 2013-05-15T15:58:43.807 回答