Резюме: 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?
Потому что это как раз основная идея 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) {
}
В п. 4.1 стандарта говорится, как выполняются преобразования:
Стандартные преобразования — это неявные преобразования со встроенным значением. В разделе 4 перечисляется полный набор таких преобразований. Стандартная последовательность преобразования — это последовательность стандартных преобразований в следующем порядке:
— Ноль или одно преобразование из следующего набора: преобразование lvalue-в-значение, преобразование массива в указатель и преобразование функции в указатель.
— Ноль или одно преобразование из следующего набора: интегральные преобразования, повышение с плавающей запятой, целочисленные преобразования, преобразования с плавающей запятой, преобразования с плавающей запятой, преобразования указателей, преобразования указателей в члены и логические преобразования.
— Ноль или одна квалификация конверсии.
Таким образом, компилятор выполняет «ноль или одно преобразование» только для некоторых, ни одного или всех преобразований каждого из перечисленных выше типов, а не произвольно много. И это действительно хорошая вещь.
Чтобы понять, почему это происходит, вы должны понимать, как использовать nullptr
, Проверьте эти ссылки ниже:
Я надеюсь, что это помогает.
Keyworkd nullptr вводится в C ++ 11, потому что множественное определение C НОЛЬ, и это путает при перегрузке функции с аргументами int и NULL.
#define NULL 0
#define NULL (void*)0
В Библии Язык программирования C ++ (4-й), стр. 270
Преобразование указателя в bool полезно в условиях, но в другом месте сбивает с толку.
Поэтому я думаю, что nullptr_t переменное преобразование в int недопустимо, потому что это причина, по которой он существует, но его можно использовать в качестве условия проверки, такого как переменные bool.