features - c++ override
¿Qué es mejor usar en C++ 11, cero o nulo? (3)
C ++ 11 tiene una nueva palabra clave literal nullptr
. Es mejor que 0
o NULL
para cosas como esta porque no hay posibilidad de que se use como un int
en la resolución de sobrecarga.
if ( nullptr == p )
O, por supuesto, puedes usar un puntero en un contexto bool:
if ( !p )
Hoy en día, con C ++ 11, ¿Qué se recomienda usar, Zero
o NULL
? El primero del segundo si?
int * p = getPointer();
if( 0 == p ){
// something
}
if( NULL == p ){
// something
}
ACTUALIZACIÓN: me olvido del nuevo
if( nullptr == p ){
// something
}
ACTUALIZACIÓN 2: los ejemplos son para mostrar las opciones para escribir un puntero nulo, sé que es más agradable escribir if( !p )
.
Las otras respuestas son correctas. Pero quería decir un poco más sobre por qué nullptr
es mejor.
En C ++ 11 el "reenvío perfecto" es muy importante. Se utiliza en todas partes. Los lugares obvios son bind
y function
. Pero también se utiliza en una multitud de otros lugares bajo las cubiertas. Pero el "reenvío perfecto" no es perfecto. Y uno de los lugares en los que falla son las constantes de puntero nulas.
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);
}
Con una definición apropiada de type_name<T>()
, en mi sistema esto se imprime:
int
long
std::nullptr_t
Esto puede hacer fácilmente la diferencia entre el código de trabajo y los errores. Con un poco de suerte, tus errores llegarán en tiempo de compilación (con mensajes de error horribles). Pero también puede obtener errores de tiempo de ejecución en algunas circunstancias.
Prohibir agresivamente el uso de 0 y NULL en su código.
Incluso si no eres un reenvío perfecto en tu código, es muy probable que el código al que llamas (como el std :: lib) lo esté usando debajo de las cubiertas.
Tampoco, es nullptr
.
Aunque, en tu caso, me gustaría ir con
if ( !p ){
//something
}
2.14.7 literales de puntero [lex.nullptr]
1 El puntero literal es la palabra clave
nullptr
. Es un prvalue de tipostd::nullptr_t
. [Nota:std::nullptr_t
es un tipo distinto que no es un tipo de puntero ni un puntero al tipo de miembro; más bien, un valor predeterminado de este tipo es una constante de puntero nulo y se puede convertir en un valor de puntero nulo o un valor de puntero de miembro nulo.