0

我已经阅读了很多关于为什么不能在 C++ 中添加两个字符串文字等的帖子,并且 operator+ 支持将字符串文字添加到整数。

但是,我试图理解以下代码中的编译器错误:

string str1, str2, str3;
int i = 10;

str1 = "Hello " + i;
str2 = i + "Mars";
str3 = "Hello " + i + "Mars";

的初始化str1str2工作正常,但构造str3给出以下错误:

example.cpp:在函数中int main(): example.cpp:20:27:错误:类型和二进制
的无效操作数const char*const char [5]operator+

Q1:在错误信息中,我理解const char [5]是指"Mars". 转换为 a 后const char*的整数指的是什么?ichar *

Q2:operator+具有从左到右的关联性,我猜测的构造str3可以写成:

str3 = ("Hello " + i) + "Mars";

评估("Hello " + i)为?char *

Q3:在以下代码中:

str5 = string("foo ") + "bar ";
str6 = string("foo ") + "bar " + i;

编译的设置str5很好,但str6会生成错误消息的负载(页面和一半)。结果是什么string("foo ") + "bar ",是一个"string"

提前感谢您的任何见解。

4

3 回答 3

7

str1获取字符串文字(实际上是一个常量字符数组),将其衰减为指向第一个字符的指针,并向该指针添加 10,导致 aconst char *超出字符串文字,这是未定义的行为,因为它超出了过去结束。

str2与 做同样的事情str1,但越界越远。

str3"Hello"用and做同样的事情i,然后尝试将结果添加const char *到您的其他字符串文字(同样,一个常量字符数组,由于传递给函数而衰减)。不会有任何过载and ,因此你operator+会得到错误。const char *const char *

请注意,这些都不会像您希望的那样工作。编译的是未定义的行为。std::string已重载operator+以适合其用途,因此将字符串文字添加到 a std::stringjust 将其连接起来。但是,添加一个整数有点模棱两可(因此不支持operator+),因此您必须先将其转换为字符串来明确您的意图:

str6 = string("foo ") + "bar " + std::to_string(i);
于 2013-04-16T21:50:15.983 回答
3

Q1:在错误信息中,我理解 const char [5]' 指的是“Mars”。const char*' 指的是什么,转换为“char *”后的整数 i?

它指的是 的结果"Hello" + i

Q2:operator+有从左到右的结合性,我猜str3的构造可以写成:str3 = ("Hello" + i) + "Mars";

("Hello" + i) 计算结果是否为 char *?

是的。但是,它的计算结果为const char*

Q3:string("foo") + "bar"的结果是什么,是"string"吗?

是的,它是一个std:string. 你得到一个错误,str6 = string("foo ") + "bar " + i;因为你不能添加一个字符串和一个整数。

附注 - 以下三个语句都不是初始化:

str1 = "Hello " + i;
str2 = i + "Mars";
str3 = "Hello " + i + "Mars";

他们都调用赋值运算符。

于 2013-04-16T21:48:52.337 回答
1

问题是,“Hello”文字被视为 char*。您可以通过向其添加一个 int 来对 char* 进行指针算术 - 您说的是“超出 char* 指向的 10 个字符”。换句话说,垃圾。

简而言之,您需要使用 boost::lexical_cast 或 istringstream 来处理这种事情。

于 2013-04-16T21:48:40.277 回答