Подтвердить что ты не робот

Что лучше использовать в С++ 11, Zero или NULL?

В настоящее время, с С++ 11, рекомендуется использовать Zero или NULL? Первый из второго, если?

int * p = getPointer();

if( 0 == p ){
    // something
}

if( NULL == p ){
    // something
}

ОБНОВЛЕНИЕ: Я забыл новый

if( nullptr == p ){
    // something
}

ОБНОВЛЕНИЕ 2: в примерах должны отображаться опции для записи нулевого указателя, я знаю, что приятнее писать if( !p ).

4b9b3361

Ответ 1

Другие ответы правильные. Но я хотел сказать немного больше о , почему nullptr лучше.

В С++ 11 "идеальная пересылка" очень важна. Он используется повсюду. Очевидные места bind и function. Но он также используется во множестве других мест под обложками. Но "идеальная пересылка" не идеальна. И одно из мест, где он терпит неудачу, - это константы нулевого указателя.

template <class T>
void display(T)
{
    std::cout << type_name<T>() << '\n';
}

template <class T>
void
f(T&& t)
{
    display(std::forward<T>(t));  // "perfectly forward" T
}

int main()
{
    f(0);
    f(NULL);
    f(nullptr);
}

При соответствующем определении type_name<T>() в моей системе это выдает:

int
long
std::nullptr_t

Это может легко сделать разницу между рабочим кодом и ошибками. При любой удаче ваши ошибки появятся во время компиляции (с ужасными сообщениями об ошибках). Но при некоторых обстоятельствах вы также можете получить ошибки времени выполнения.

Агрессивно запретить использование 0 и NULL в вашем коде.

Даже если вы не идеальны в своем коде, код, который вы вызываете (например, std:: lib), очень вероятно использует его под обложками.

Ответ 2

Ни то, ни другое nullptr.

Хотя, в вашем случае, я бы просто пошел с

if ( !p ){
   //something
}

2.14.7 Литераторы указателей [lex.nullptr]

1 Литералом указателя является ключевое слово nullptr. Это prvalue типа std::nullptr_t. [Примечание: std::nullptr_t- это отдельный тип, который не является ни указательным типом, ни указателем на тип члена; скорее, значение этого типа константу нулевого указателя и можно преобразовать в значение нулевого указателя или значение указателя нулевого элемента.

Ответ 3

С++ 11 имеет новое ключевое слово literal nullptr. Это лучше, чем 0 или NULL для таких вещей, потому что нет шансов, что он будет использоваться как int в разрешении перегрузки.

if ( nullptr == p )

Или, конечно, вы можете просто использовать указатель в контексте bool:

if ( !p )