连接两个字符串

Ahm*_*d A 0 c++ string

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

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

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

str1 = "Hello " + i;
str2 = i + "Mars";
str3 = "Hello " + i + "Mars";
Run Code Online (Sandbox Code Playgroud)

初始化str1str2工作正常,但构造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";
Run Code Online (Sandbox Code Playgroud)

("Hello " + i)计算为char *

Q3:在以下代码中:

str5 = string("foo ") + "bar ";
str6 = string("foo ") + "bar " + i;
Run Code Online (Sandbox Code Playgroud)

设置str5编译正常,但str6生成错误消息的加载(页面和一半).结果string("foo ") + "bar "是什么,是"string"吗?

提前感谢您的任何见解.

chr*_*ris 7

str1获取字符串文字(实际上是一个常量字符数组),将其衰减为指向第一个字符的指针,并向该指针添加10,导致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);
Run Code Online (Sandbox Code Playgroud)