TL;DR:
operator+=
是
class string
的成员函数,而
operator+
是一个模板函数。
标准类模板
template<typename CharT> basic_string<CharT>
重载了函数
basic_string& operator+=(CharT)
,而字符串只是
basic_string<char>
。
由于适合较低类型的值可以自动转换为该类型,在表达式
s += 2
中,数字 2 不被视为
int
,而是被视为
char
。它会产生与
s += '\x02'
完全相同的效果。追加的是 ASCII 码为 2(STX)的字符,而不是数字 '2'(其 ASCII 值为 50 或 0x32)。
然而,字符串并没有像
string operator+(int)
这样的重载成员函数,因此
s + 2
不是有效的表达式,在编译期间会引发错误。(更多内容详见下文)
你可以用以下方式在字符串中使用
operator+
函数:
s = s + char(2)
s = s + std::string(2)
s = s + std::to_string(2)
对于那些关心为什么使用operator+
时2不会自动转换为char
的人,
template <typename CharT>
basic_string<CharT>
operator+(const basic_string<CharT>& lhs, CharT rhs);
上述是在 s + 2
中加法运算符的原型[注],因为它是一个模板函数,所以需要实现 operator+<char>
和 operator+<int>
,这两者是冲突的。详情请参见为什么模板函数不适用于自动向下转换?
与此同时,operator+=
的原型是:
template <typename CharT>
class basic_string{
basic_string&
operator+=(CharT _c);
};
你看,这里没有模板(它是类成员函数),所以编译器从类实现推断出类型CharT是char
,并且int(2)
自动转换为char(2)
。
注意:从C++标准库源代码复制时,会剥离不必要的代码。这包括模板类“basic_string”中的typename 2和3(Traits和Allocator),以及不必要的下划线,以提高可读性。
std::to_string
函数。 - Jesper Juhloperator+
期望一个string
而不是一个int
。 - Bo Halimint
类型的值直接附加到字符串中。你可以将代表整数值的 文本 附加到字符串中,但不要忽略转换步骤。请注意保留此转换过程。 - Pete Becker