¿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?

Author: Josh Lee, 0000-00-00

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). nullptres 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 tipo std::nullptr_t es una constante de puntero nulo, y que una constante de puntero nulo integral se puede convertir a std::nullptr_t. La dirección opuesta no está permitida. Esto permite sobrecargar una función tanto para punteros como para enteros, y pasar nullptr para seleccionar la versión del puntero. Pasar NULL o 0 sería confusamente seleccionar la versión int.

  • Un molde de nullptr_t a un tipo integral necesita un reinterpret_cast, y tiene la misma semántica que un molde de (void*)0 a un tipo integral (implementación de asignación definida). A reinterpret_cast no puede convertir nullptr_t a ningún tipo de puntero. Confiar en la conversión implícita si posible o utilizar static_cast.

  • La Norma requiere que sizeof(nullptr_t) sea sizeof(void*).

 360
Author: Johannes Schaub - litb,
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:

 51
Author: nik,
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)  {  }
 33
Author: Motti,
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

¿Por qué nullptr en C++11? ¿Qué es eso? ¿Por qué NULL no es suficiente?

Experto en C++

 13
Author: ,
Warning: date() expects parameter 2 to be long, string given in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61