#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(已定义)连接?
答案 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