C++字符串与字面量相加问题:s6与s7的差异解析
为什么s6的每个+都有字符串操作数,s7却不行?
这个问题的核心在于C++中std::string的operator+重载规则,以及表达式的左到右求值顺序,咱们一步步拆解清楚:
先搞懂基础规则
C++标准库只为std::string的operator+定义了几种合法的组合:
std::string + std::string:两个字符串对象拼接std::string + const char*(字符串字面量):字符串对象和字面量拼接std::string + char:字符串对象和单个字符拼接- 反过来,
const char* + std::string、char + std::string也都是合法的(因为有对应的重载)
但两个const char*(也就是两个字符串字面量)相加是完全不合法的——C++里没有定义这种操作,编译器会把它当成指针地址相加,这显然不是你想要的字符串拼接效果,直接报错。
分析s6:s1 + ", " + "world"
表达式是从左到右求值的:
- 第一步:
s1是std::string对象,", "是const char*字面量,调用合法的operator+,返回一个临时的std::string对象(内容是"hello, ") - 第二步:用这个临时
std::string对象和"world"(const char*)相加,再次调用合法的operator+,得到最终的字符串对象
整个过程中,每一次+操作都至少有一个std::string类型的操作数,所以完全合法。
分析s7:"hello" + ", " + s2
同样按左到右顺序求值:
- 第一步:
"hello"和", "都是const char*类型,没有对应的operator+重载,编译器直接报错——这一步根本通不过,完全轮不到后面和s2相加的环节
这就是为什么s7不满足“每个+都有字符串操作数”的原因:第一个+的两边都是字面量,没有std::string参与,直接触发错误。
额外补充:类似的错误案例
比如代码里的s5 = "hello" + ", ";,也是两个const char*相加,同样会报错,原理和s7的第一步完全一样。
内容的提问来源于stack exchange,提问作者Jake Wright
相关产品推荐
相关产品推荐

