Подтвердить что ты не робот

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++, и я получил тот же результат выше. Поэтому я считаю, что мне не хватает чего-то определенного по стандарту. Что это?

4b9b3361

Ответ 1

Проблема в том, что буква 0 является константой нулевого указателя. Компилятор не знает, имел ли смысл:

std::string::operator +=(const char*);  // tmp += "abc";

или

std::string::operator +=(char);         // tmp += 'a';

(лучшие компиляторы перечисляют параметры).

Рабочий стол (как вы обнаружили) заключается в том, чтобы написать append как:

tmp += '\0';

(Я предполагаю, что вы не хотели, чтобы строка версии - tmp += nullptr; была UB во время выполнения.)

Ответ 2

Литерал 0 неявно конвертируется во все типы указателей (в результате их соответствующие константы нулевого указателя). Поэтому он приводит к двум одинаково допустимым последовательностям преобразования для сопоставления оператора добавления t21.