Если у меня есть строка string foo
и я пишу foo += 27
что добавляется к строке? Это символ с шестнадцатеричным значением ASCII 0x27 или с 0x1b?
Кроме того, когда я пытаюсь foo += 0
Я получаю ошибку компиляции, говорящую о неоднозначной перегрузке оператора + = со строкой и int. Почему я не получаю ошибку компиляции с добавлением ненулевых чисел, но я получаю ошибку с нулем?
Если я сначала скажу int z = 0
а потом foo += z
Я не получаю ошибку. Что вызывает разницу?
Это символ с шестнадцатеричным значением ASCII 0x27 или с 0x1b?
Так как ты не пишешь foo += 0x27
видимо это 0x1b.
Когда вы добавляете 0, компилятор не может различить две перегрузки: одна добавляет символ, а другая — указатель на символ. Перегрузка, добавляющая int, будет лучшим совпадением, но она не объявлена в шаблоне basic_string.
Я изначально ошибался, когда писал, что компилятор лечит foo + 27
такой же как foo + '\033'
или же foo + '\x1b'
, (Любой из них был бы лучшим способом написать выражение.) Тип символьной константы int
в С, но char
в C ++. Однако из-за неявного преобразования между char
а также int
и потому что нет более конкретного std::basic_string<T>::operator+(int)
компилятор завершает преобразование 27
в '\x1b'
тем не мение.
C ++ изначально используется 0
в качестве ключевого слова для нулевого указателя, так foo + 0
может означать либо foo + static_cast<const char*>(0)
(более кратко, foo + nullptr
) или же foo + '\0'
, Первый — неопределенное поведение и не имеет логического смысла, но компилятор не догадывается, что вы имели в виду другое.