Std::string + = оператор не может передать 0 в качестве аргумента
std::string tmp;
tmp +=0;//compile error:ambiguous overload for 'operator+=' (operand types are 'std::__cxx11::string {aka std::__cxx11::basic_string<char>}' and 'int')
tmp +=1;//ok
tmp += '\0';//ok...expected
tmp +=INT_MAX;//ok
tmp +=int(INT_MAX);//still ok...what?
Первый утверждает, что передача целого в качестве аргумента, правильно? Почему другие передают компиляцию? Я тестировал на Visual С++ и g++, и я получил тот же результат выше. Поэтому я считаю, что мне не хватает чего-то определенного по стандарту. Что это?
Ответы
Ответ 1
Проблема в том, что буква 0 является константой нулевого указателя. Компилятор не знает, имел ли смысл:
std::string::operator +=(const char*); // tmp += "abc";
или
std::string::operator +=(char); // tmp += 'a';
(лучшие компиляторы перечисляют параметры).
Рабочий стол (как вы обнаружили) заключается в том, чтобы написать append как:
tmp += '\0';
(Я предполагаю, что вы не хотели, чтобы строка версии - tmp += nullptr;
была UB во время выполнения.)
Ответ 2
Литерал 0
неявно конвертируется во все типы указателей (в результате их соответствующие константы нулевого указателя). Поэтому он приводит к двум одинаково допустимым последовательностям преобразования для сопоставления оператора добавления t21.