Ответ 1
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'
. A char с кодом ASCII 2 (STX) добавляется, не символ "2" (с ASCII-значением 50 или 0x32).
Однако строка не имеет перегруженной функции-члена, такой как string operator+(int)
, s + 2
не является допустимым выражением, поэтому выдает ошибку во время компиляции. (Более подробно)
Вы можете использовать функцию operator + в строке следующими способами:
s = s + char(2); // or (char)2
s = s + std::string(2);
s = s + std::to_string(2); // C++11 and above only
Для людей, обеспокоенных тем, почему 2 не автоматически добавляется к char
с помощью operator+
,
template <typename CharT>
basic_string<CharT>
operator+(const basic_string<CharT>& lhs, CharT rhs);
Вышеописанный прототип [note] для оператора плюс в s + 2
, и поскольку он является функцией шаблона, ему требуется реализация как operator+<char>
, так и operator+<int>
, что противоречиво. Подробнее см. Почему автоматическое подавление применяется к функциям шаблона?
Между тем прототипом operator+=
является:
template <typename CharT>
class basic_string{
basic_string&
operator+=(CharT _c);
};
Вы видите, здесь нет шаблона (это функция-член класса), поэтому компилятор выводит, что тип CharT char
из реализации класса, а int(2)
автоматически добавляется в char(2)
.
Примечание: Ненужный код удаляется при копировании из стандарта С++, включая источник. Это включает в себя typename 2 и 3 (Traits and Allocator) для класса шаблона "basic_string" и ненужные символы подчеркивания, чтобы улучшить читаемость.