无法在C ++中添加字符串

时间:2010-02-24 20:58:31

标签: c++

#include <iostream>


int main()
{
    const std::string exclam = "!";
    const std::string message = "Hello" + ", world" + exclam;
    std::cout << message;
    return 0;
}

为什么这段代码不起作用?错误返回:

error: invalid operands of types `const char[6]' and `const char[8]' to binary `operator+'

提前致谢!

编辑:

感谢所有答案。这是我第一次访问该网站,我对如此短暂的时间间隔内精心解释的数量感到惊讶。

关于实际问题。那为什么会这样:

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

是因为“,世界”还是之后“!”与变量hello(已定义)连接?

7 个答案:

答案 0 :(得分:19)

因为在C ++中,字符串文字(如"Hello")不是std::string类型。它们是普通字符数组或C风格字符串。

因此对于行const std::string message = "Hello" + ", world" + exclam;,编译器必须使用的类型是:

const std::string message = const char[6] + const char[8] + std::string;

并且给定+的关联性,它必须执行的操作是:

const std::string message = ((const char[6] + const char[8]) + std::string);

也就是说,必须首先评估最左边的添加,并将结果传递给最右边的添加。

因此编译器会尝试评估const char[6] + const char[8]。 没有为数组定义添加。数组被隐式转换为指针,但这对编译器没有帮助。这只意味着它以const char* + const char*结束,并且没有为指针定义任何添加。

此时,它不知道您希望将结果转换为std::string

然而,在你的第二个例子中:

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

它有效,因为编译器看到的操作是std::string + const char[8] + const char[2]。这里,第一个加法可以转换为std::string + const char*,这里定义加法运算符 ,并返回std::string。所以编译器已成功找到第一个加法,并且由于结果是一个字符串,第二个加法看起来像这样:std::string + const char[2],和之前一样,这是不可能的,但是数组可以转换为指针,然后编译器能够找到有效的加法运算符,再次产生std::string

答案 1 :(得分:15)

"Hello" + ", world"

由于这些是c风格的字符串,因此无法用+附加它们。你可以将一个std :: string附加到一个c风格的字符串,但不能用这种方式附加2个c风格的字符串,而是在其中一个字符串周围添加一个std :: string()构造函数来制作一个临时字符串,即:

"Hello" + std::string(", world")

答案 2 :(得分:6)

C ++没有做其他OO语言的许多自动“幕后”对话。

正如Doug所说,你需要做std :: string(“hello”)+ std :: string(“world”),这种语言并没有为你做到这一点。

但是你可以做到

std::cout << "hello" << "world" << exclam;

因为std :: cout知道如何打印const char []以及字符串

答案 3 :(得分:4)

在您构成消息的行中,首先执行=右侧的整个表达式,然后才将其分配给C ++字符串。那时,你的“Hello”和你的“,World”仍然是C字符串(const char []),这就是你收到错误的原因。添加从左到右,因此在尝试将组合添加到std :: string exclam之前添加了一对C字符串。

您需要在表达式中强制转换它们(例如,std :: string(“Hello”)),或者像使用Exclam一样为每个变量创建字符串变量。

答案 4 :(得分:4)

字符串文字在C ++中只是零终止的字符数组。没有运算符允许您在C ++中添加2个字符数组。

但是有一个char数组和std :: string +运算符。

更改为:

const std::string message = std::string("Hello") +", world" + exclam;

在某些语言中,Python字符串文字等同于字符串类型的变量。 C ++不是这样的语言。

答案 5 :(得分:3)

C风格的字符串(“Hello”和“,world”)等同于匿名数组:

static const char anon1[6] = { 'H', 'e', 'l', 'l', 'o', '\0' };
static const char anon2[8] = { ',', ' ', 'w', 'o', 'r', 'l', 'd', '\0' };

...所以当你输入"Hello" + ", world"时,你试图添加两个数组anon1 + anon2,这不是C或C ++支持的操作。

请记住,C / C ++中的字符串文字只是数组(或数组的地址)。您必须使用字符串类(例如std:string)才能使用+之类的运算符。

答案 6 :(得分:0)

问题在于诸如"this is a literal"之类的基本字符串文字不是std::string类型,因此它们不与+运算符连接。

在帖子C++14中,您可以使用标准用户定义的字符串文字,其字符串类型为std::string的:

using namespace std::literals; // somewhere in the scope

auto message = "Hello"s + ", world"s; // message is type std::string

请参见std::literals::string_literals::operator""s