Почему нельзя преобразовать 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?
Ответы
Ответ 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.