2010-02-24 109 views
14
#include <iostream> 


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

为什么此代码不起作用?错误返回:无法在C++中添加字符串

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

为什么不这样做: const std :: string message =“Hello,world”+ exclam; – 2010-02-24 21:32:06

+0

欢迎来到本网站!只是供参考,如果有你喜欢的答案,确保你接受它。你更有可能在未来获得帮助。 – JasCav 2010-02-24 21:44:28

回答

18

因为在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

+5

+1,@jalf - 出色的答案 – 2010-02-24 21:53:56

4

在形成消息的行中,首先执行=右边的整个表达式,然后才将其分配给C++字符串。此时,你的“你好”和你的“世界”仍然是C字符串(const char []),这就是你出错的原因。加法从左到右,因此在尝试将组合添加到std :: string exclam之前,会添加一对C字符串。您需要将它们转换为表达式(例如,std :: string(“Hello”)),或者为每个类型创建字符串变量,就像您使用Exclam所做的一样。

15
"Hello" + ", world" 

由于这些都是c风格的字符串,所以不能附加+。您可以将std :: string附加到c样式的字符串中,但不是以这种方式添加2个c样式的字符串,而是在其中一个std :: string()构造函数周围添加一个临时的字符串,即:

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

他也可以在''Hello“'和'”world“之间省略'+'运算符,例如: const std :: string message =”Hello“”world“+ exclam;' 这是也是连接字符串文字的一种可接受的方式。 – fogo 2010-02-24 21:31:21

4

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

然而,有一个char数组和std :: string +运算符。

更改为:

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

在像Python字符串文字有些语言等同于类型的字符串变量。 C++不是这样一种语言。

6

C++不会执行许多其他面向对象语言的自动'幕后'对话。由于Doug说你需要做std :: string(“hello”)+ std :: string(“world”),所以语言不会为你做这件事。

但是你可以做

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

因为性病::法院知道如何打印一个const char [],以及作为一个字符串

3

C风格的字符串(“你好”和”世界“)相当于匿名阵列:

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

...所以当你输入"Hello" + ", world"时,你试图添加两个不是C或C++支持的操作的数组anon1 + anon2。请记住,C/C++中的字符串文字只是数组(或数组的地址)。您必须使用字符串类(例如std:string)才能使用像+这样的运算符。