Выбор ответа Middle Указатели и ссылки обновлено
nullptr против NULL в перегрузке
Вопрос
Есть перегрузки void f(int); и void f(char*);. Что вызовет f(nullptr)?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: f(char): nullptr приводится к указателю, но не к int. nullptr имеет тип std::nullptrt, который неявно преобразуется в любой тип указателя и в bool (в прямой инициализации), но не в int.
Варианты ответа
f(int):nullptrравен нулю и точнее совпадает сint- Ошибка неоднозначности: оба преобразования равноценны
- Зависит от компилятора: стандарт не задаёт выбор перегрузки
f(char*):nullptrприводится к указателю, но не кintправильный ответ
Разбор
nullptr имеет тип std::nullptr_t, который неявно преобразуется в любой тип указателя и в bool (в прямой инициализации), но не в int. Поэтому выбирается f(char*).
f(NULL)в GCC выберетf(int)или будет неоднозначным:NULLэто целочисленная константа (__null), отсюда и проблема.- С
nullptrнеоднозначности нет, поведение одинаково во всех компиляторах.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Термины по теме
Ещё по теме «Указатели и ссылки»
- Удалить узлы списка с заданными значениями
- Кольцевой буфер для логов
- Повернуть матрицу, хранящуюся одним буфером
- Указатель за конец массива
- sizeof массива-параметра
- const до и после звёздочки
- Откуда берутся висячие ссылки
- Что выведет: арифметика указателей и ссылки