Почему 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?

16

Решение

Потому что это как раз основная идея 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) {
}
29

Другие решения

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

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

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

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

— Ноль или одна квалификация конверсии.

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

18

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

Я надеюсь, что это помогает.

2

Keyworkd nullptr вводится в C ++ 11, потому что множественное определение C НОЛЬ, и это путает при перегрузке функции с аргументами int и NULL.

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

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

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

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

0
По вопросам рекламы [email protected]