Выбор ответа Middle Указатели и ссылки обновлено

nullptr против NULL в перегрузке

Вопрос

Есть перегрузки void f(int); и void f(char*);. Что вызовет f(nullptr)?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: f(char): nullptr приводится к указателю, но не к int. nullptr имеет тип std::nullptrt, который неявно преобразуется в любой тип указателя и в bool (в прямой инициализации), но не в int.

Варианты ответа

  1. f(int): nullptr равен нулю и точнее совпадает с int
  2. Ошибка неоднозначности: оба преобразования равноценны
  3. Зависит от компилятора: стандарт не задаёт выбор перегрузки
  4. f(char*): nullptr приводится к указателю, но не к intправильный ответ

Разбор

nullptr имеет тип std::nullptr_t, который неявно преобразуется в любой тип указателя и в bool (в прямой инициализации), но не в int. Поэтому выбирается f(char*).

  • f(NULL) в GCC выберет f(int) или будет неоднозначным: NULL это целочисленная константа (__null), отсюда и проблема.
  • С nullptr неоднозначности нет, поведение одинаково во всех компиляторах.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.

Термины по теме