Что лучше использовать в С++ 11, Zero или NULL?
В настоящее время, с С++ 11, рекомендуется использовать Zero
или NULL
? Первый из второго, если?
int * p = getPointer();
if( 0 == p ){
// something
}
if( NULL == p ){
// something
}
ОБНОВЛЕНИЕ: Я забыл новый
if( nullptr == p ){
// something
}
ОБНОВЛЕНИЕ 2: в примерах должны отображаться опции для записи нулевого указателя, я знаю, что приятнее писать if( !p )
.
Ответы
Ответ 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 )