我已经阅读了很多帖子,说明为什么在C ++等中不能添加两个字符串文字,而运算符+支持将字符串文字添加到整数。
但是,我试图理解以下代码中的编译器错误:
string str1, str2, str3;
int i = 10;
str1 = "Hello " + i;
str2 = i + "Mars";
str3 = "Hello " + i + "Mars";
str1
和str2
的初始化工作正常,但str3
的构造会出现以下错误:
example.cpp:在函数
int main()
中:
example.cpp:20:27:错误:类型为const char*
和const char [5]
的操作数无效 二进制operator+
Q1:在错误消息中,我了解const char [5]
是指"Mars"
。 const char*
引用了什么,转换为i
后的整数char *
?
Q2:operator+
具有从左到右的关联性,我猜测str3
的构造可以写成:
str3 = ("Hello " + i) + "Mars";
("Hello " + i)
是否评估为char *
?
问题3:在以下代码中:
str5 = string("foo ") + "bar ";
str6 = string("foo ") + "bar " + i;
设置str5
编译正常,但str6
生成错误消息的加载(页面和一半)。 string("foo ") + "bar "
的结果是什么,是"string"
?
提前感谢任何见解。
答案 0 :(得分:7)
str1
获取字符串文字(实际上是一个常量字符数组),将其衰减为指向第一个字符的指针,并向该指针添加十个,从而产生一个const char *
以外的字符字符串文字,这是未定义的行为,因为它超过了一个结束。
str2
与str1
做同样的事情,但更远离界限。
str3
对"Hello"
和i
做同样的事情,然后尝试将结果const char *
添加到您的其他字符串文字(同样,一个常量字符数组) ,由于被传递到函数中而衰减)。 operator+
和const char *
不会超载const char *
,因此会出错。
请注意,这些都不会像您希望的那样工作。编译的是未定义的行为。 std::string
重载operator+
以满足其目的,因此将字符串文字添加到std::string
只是连接它。虽然添加一个整数有点含糊不清(因此不支持operator+
),所以你必须先通过将它转换为字符串来明确你的意图:
str6 = string("foo ") + "bar " + std::to_string(i);
答案 1 :(得分:3)
Q1:在错误消息中,我理解const char [5]'指的是“Mars”。在转换为“char *”后,conconst char *'引用的是整数i?
它指的是"Hello" + i
的结果。
Q2:运营商+具有从左到右的关联性,我猜测str3的构造可以写成: str3 =(“你好”+ i)+“火星”;
(“Hello”+ i)是否评估为char *?
是。不过,它的评估结果为const char*
。
问题3:字符串(“foo”)+“bar”的结果是什么,它是“字符串”吗?
是的,它是std:string
。您在str6 = string("foo ") + "bar " + i;
中收到错误,因为您无法添加字符串和整数。
附注 - 以下三个陈述中没有一个是正式的:
str1 = "Hello " + i;
str2 = i + "Mars";
str3 = "Hello " + i + "Mars";
他们都调用赋值运算符。
答案 2 :(得分:1)
事情是,“你好”文字被视为char *。你可以通过添加一个int来对char *进行指针运算 - 你说的是“超出char *指向的10个字符”。换句话说,垃圾。
简而言之,你需要使用boost :: lexical_cast或istringstream来处理这类事情。