C++中std::string与整型用+、+=运算符表现不同的原因是什么?
问题解答
两种写法对应的运算符重载规则不同,所以表现不一致,具体拆解如下:
1. a += 97 可正常运行的原因
std::string 类的成员重载函数 operator+= 存在支持 char 类型参数的版本:
basic_string& operator+= (char c);
你传入的字面量97是int类型,值刚好落在char的表示范围内,可以隐式转换为ASCII码为97的字符'a',因此会被合法匹配到该重载,直接将字符追加到字符串末尾,所以最终输出a。
2. a = a + 97 编译报错的原因
std::string 对应的非成员二元 operator+ 没有支持std::string与int相加的重载版本。目前标准库提供的string相关+运算符重载,仅支持以下合法的参数组合:
std::string+std::stringstd::string+const char*std::string+char- 以上三种的参数左右交换版本
当你写a + 97时,左操作数是std::string类型,右操作数是int类型,没有任何重载可以匹配该参数组合,且模板参数推导也无法完成隐式类型转换,因此直接报编译错误。
误区说明
x += y 等价于 x = x + y 只是通用的语义假设,该规则成立的前提是两种运算符都存在对应合法的重载、且语义实现一致。在std::string的场景下两者的重载支持的参数列表不同,因此并不完全等价。
如果需要让后者写法正常运行,可以显式将int转为char:
a = a + static_cast<char>(97);
内容的提问来源于stack exchange,提问作者Nakul Gopal
相关产品推荐
相关产品推荐

