числовые — добавление int к строке переполнения стека

Если у меня есть строка string foo и я пишу foo += 27что добавляется к строке? Это символ с шестнадцатеричным значением ASCII 0x27 или с 0x1b?

Кроме того, когда я пытаюсь foo += 0Я получаю ошибку компиляции, говорящую о неоднозначной перегрузке оператора + = со строкой и int. Почему я не получаю ошибку компиляции с добавлением ненулевых чисел, но я получаю ошибку с нулем?

Если я сначала скажу int z = 0 а потом foo += zЯ не получаю ошибку. Что вызывает разницу?

3

Решение

Это символ с шестнадцатеричным значением ASCII 0x27 или с 0x1b?

Так как ты не пишешь foo += 0x27видимо это 0x1b.

Когда вы добавляете 0, компилятор не может различить две перегрузки: одна добавляет символ, а другая — указатель на символ. Перегрузка, добавляющая int, будет лучшим совпадением, но она не объявлена ​​в шаблоне basic_string.

3

Другие решения

Я изначально ошибался, когда писал, что компилятор лечит 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', Первый — неопределенное поведение и не имеет логического смысла, но компилятор не догадывается, что вы имели в виду другое.

2

По вопросам рекламы [email protected]