Почему нельзя преобразовать nullptr в int? - программирование
Подтвердить что ты не робот

Почему нельзя преобразовать nullptr в int?

Сводка: nullptr преобразуется в bool, а bool преобразуется в int, поэтому почему nullptr не конвертируется в int?

Этот код в порядке:

void f(bool);
f(nullptr);      // fine, nullptr converts to bool

И это нормально:

bool b;
int i(b);        // fine, bool converts to int

Так почему же это не так?

void f(int);
f(nullptr);      // why not convert nullptr to bool, then bool to int?
4b9b3361

Ответ 1

Потому что это именно основная идея nullptr.

nullptr должен был избегать такого поведения:

struct myclass {};

void f(myclass* a) { std::cout << "myclass\n"; }
void f(int a) { std::cout << "int\n"; }

// ...

f(NULL); // calls void f(int)

Если nullptr были конвертированы в int, это будет происходить.

Итак, вопрос в том, "почему он конвертируется в bool?".

Syntax- "suggarness":

int* a = nullptr;
if (a) {
}

Что выглядит лучше, чем:

if (a == nullptr) {
}

Ответ 2

В § 4.1 Стандарта говорится, как выполняются преобразования:

Стандартные преобразования - это неявные преобразования со встроенным значением. В пункте 4 перечисляется полный набор таких преобразований. Стандартная последовательность преобразования представляет собой последовательность стандартных преобразований в следующем порядке:

- Нулевое или одно преобразование из следующего набора: преобразование lvalue-в-rval, преобразование между массивами и указателями и преобразование функции в указатель.

- Нулевое или одно преобразование из следующего набора: интегральные промо-акции, продвижение с плавающей запятой, интегральные преобразования, конверсии с плавающей запятой, конверсии с плавающим интегралом, преобразования указателей, указатели на преобразования членов и логические преобразования.

- Нулевое или одно квалификационное преобразование.

Таким образом, компилятор выполняет только "ноль или одно преобразование" некоторых, ни одного или всех из перечисленных типов конверсий, а не сколь угодно много. И это действительно хорошая вещь.

Ответ 3

Чтобы понять, почему это происходит, вы должны понимать, как использовать nullptr. Проверьте следующие ссылки ниже:

Надеюсь, это поможет.

Ответ 4

Keyworkd nullptr вводится в С++ 11, поскольку множественное определение C NULL, и оно сбивает с толку при перегрузке функции с помощью аргументов int и NULL.

#define NULL 0
#define NULL (void*)0

В Библии Язык программирования С++ (4-й), стр. 270

Преобразование pointer-to-bool полезно в условиях, но запутывает в другом месте.

Итак, я думаю, что nullptr_t varible конвертировать в int не допускается, потому что причина, по которой он существует, но может использоваться как условие теста, такое как переменные bool.