Могу ли я гарантировать, что адрес nullptr всегда равен 0? - PullRequest
1 голос
/ 14 апреля 2020

Я знаю, что NULL всегда 0, но почему следующий код печатает сообщение?

#include <iostream>

using namespace std;

int main() {
    int* ptr = nullptr;
    if (ptr == 0) {
        cout << "Does it always work?";
    }
    return 0;
}

1 Ответ

4 голосов
/ 14 апреля 2020

Да.

Указатель, инициализированный из nullptr, является нулевым указателем.

Сравнение нулевого указателя с литералом 0 (или с std::nullptr_t, что nullptr, вместе они константы нулевого указателя ) дают true, всегда.

Вы не можете сделать это с любым старым выражением; даже если целое число i равно 1, i-i не является допустимой константой нулевого указателя, несмотря на оценку 0 во время выполнения. Ваша программа не скомпилируется, если вы попытаетесь это сделать. Только литерал 0 является допустимой константой нулевого указателя, которую можно сравнить с указателями.

Кроме того, это не обязательно означает, что все биты равны нулю! Очень похоже на то, как преобразование bool в int дает вам ноль или единицу, но действительные базовые биты bool могут быть любыми для реализации.

Наконец, обратите внимание, что ваша терминология немного отличается ; за [support.types.nullptr/1], nullptr сам не имеет адреса, который может быть взят

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...