¿Qué es exactamente nullptr?
Ahora tenemos C++11 con muchas características nuevas. Una interesante y confusa (al menos para mí) es la nueva nullptr
.
Bueno, ya no hay necesidad de la macro desagradable NULL
.
int* x = nullptr;
myclass* obj = nullptr;
Aún no entiendo cómo funciona nullptr
. Por ejemplo, El artículo de Wikipedia dice:
C++11 corrige esto introduciendo una nueva palabra clave para servir como una constante de puntero nulo distinguida: nullptr. Es de tipo nullptr_t, que es implícitamente convertible y comparable a cualquier tipo de puntero o puntero a miembro. No es implícitamente convertible o comparable a los tipos integrales, excepto para bool.
¿Cómo es una palabra clave y una instancia de un tipo?
Además, ¿tienes otro ejemplo (junto al de Wikipedia) donde nullptr
es superior al viejo 0
?
4 answers
¿Cómo es una palabra clave y una instancia de un tipo?
Esto no es sorprendente. Tanto true
como false
son palabras clave y como literales tienen un tipo ( bool
). nullptr
es un puntero literal de tipo std::nullptr_t
, y es un prvalue (no se puede tomar la dirección de la misma usando &
).
4.10
about pointer conversion dice que un prvalue de tipostd::nullptr_t
es una constante de puntero nulo, y que una constante de puntero nulo integral se puede convertir astd::nullptr_t
. La dirección opuesta no está permitida. Esto permite sobrecargar una función tanto para punteros como para enteros, y pasarnullptr
para seleccionar la versión del puntero. PasarNULL
o0
sería confusamente seleccionar la versiónint
.Un molde de
nullptr_t
a un tipo integral necesita unreinterpret_cast
, y tiene la misma semántica que un molde de(void*)0
a un tipo integral (implementación de asignación definida). Areinterpret_cast
no puede convertirnullptr_t
a ningún tipo de puntero. Confiar en la conversión implícita si posible o utilizarstatic_cast
.La Norma requiere que
sizeof(nullptr_t)
seasizeof(void*)
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-11-25 04:21:04
Desde nullptr: Un Puntero Nulo de tipo seguro y Claro:
La nueva palabra clave C++09 nullptr designa una constante rvalue que sirve como un literal puntero nulo universal, reemplazando el literal 0 defectuoso y débilmente escrito y la infame macro NULL. por lo tanto, nullptr pone fin a más de 30 años de vergüenza, ambigüedad y errores. Las siguientes secciones presentan la instalación nullptr y muestran cómo puede remediar las dolencias de NULL y 0.
Otras referencias:
- WikiBooks, con código de ejemplo.
- Aquí en Stack Overflow: ¿Usas NULL o 0 (cero) para punteros en C++?
template
- Grupo de Google: comp.lang.c++.moderated-compiler discussion
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 11:47:31
Cuando tiene una función que puede recibir punteros a más de un tipo, llamarla con NULL
es ambigua. La forma en que esto se trabaja alrededor ahora es muy hacky al aceptar un int y suponiendo que es NULL
.
template <class T>
class ptr {
T* p_;
public:
ptr(T* p) : p_(p) {}
template <class U>
ptr(U* u) : p_(dynamic_cast<T*>(u)) { }
// Without this ptr<T> p(NULL) would be ambiguous
ptr(int null) : p_(NULL) { assert(null == NULL); }
};
En C++11
usted sería capaz de sobrecarga nullptr_t
, de modo que ptr<T> p(42);
sería un error en tiempo de compilación en lugar de un tiempo de ejecución assert
.
ptr(std::nullptr_t) : p_(nullptr) { }
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-01-10 07:28:27