studio programacion para móviles libro edición desarrollo desarrollar curso aprende aplicaciones c++ c++11 std nullptr

c++ - programacion - ¿Por qué no puedes tomar la dirección de nullptr?



manual de programacion android pdf (4)

Es lo mismo que no poder tomar la dirección de 5 , aunque puede tomar la dirección de un int después de darle el valor 5 . No importa que no haya un valor alternativo para que tenga nullptr_t .

Los valores no tienen direcciones; los objetos lo hacen

Se genera un objeto temporal cuando pasa tal valor a un parámetro const & , o de lo contrario vincula un valor a una referencia constante, como por static_cast< T const & >( … ) o declarando una referencia con nombre T const & foo = …; . La dirección que está viendo es la de la temporal.

En el estándar C ++ 11, no entiendo la razón por la cual no se permite tomar la dirección de nullptr, mientras que uno puede tomar la dirección de sus propias instancias std :: nullptr_t. Aparte del hecho de que nullptr es una palabra clave reservada, ¿hay algún razonamiento designado para esta decisión?

Simplemente porque me divierte, intenté circunnavegar esta restricción con la siguiente función:

decltype(nullptr)* func(const decltype(nullptr) &nref) noexcept { return const_cast<decltype(nullptr)*>(reinterpret_cast<const decltype(nullptr)*>(&nref)); }

Tuve que usar reinterpret_cast en el parámetro porque sin él estaba obteniendo el error histérico:

error: invalid conversion from ''std::nullptr_t*'' to ''std::nullptr_t*'' [-fpermissive]

Cuando llamo a esta función pasando nullptr directamente, obtengo una dirección diferente cada vez. ¿Se asigna dinámicamente a nullptr una dirección just-in-time para las comparaciones y tal? O (probablemente más probable) tal vez es el compilador forzando una copia temporal del objeto subyacente?

Por supuesto, nada de esto es información vital, solo me resulta interesante por qué se implementó esta restricción en particular (y posteriormente por qué estoy viendo el comportamiento que soy).


Si busca una respuesta estándar, el § 18.2 / 9 hace sus observaciones de manera bastante directa:

Aunque no se puede tomar la dirección de nullptr, se puede tomar la dirección de otro objeto nullptr_t que sea un valor l.

Alternativamente, el § 2.14.7 dice esto sobre nullptr :

El puntero literal es la palabra clave nullptr. Es un prvalue de tipo std :: nullptr_t.

Entonces, ¿qué es un prvalue? El § 3.10 / 1 responde que:

Un prvalue (valor r "puro") es un valor r que no es un valor x. [Ejemplo: el resultado de llamar a una función cuyo tipo de devolución no es una referencia es un valor prve. El valor de un literal como 12, 7.3e5 o verdadero también es un valor prve. - ejemplo final]

Con suerte, tratar de tomar la dirección de cualquiera de esas cosas en el ejemplo tendrá más sentido en cuanto a por qué no puede tomar la dirección de nullptr . ¡Es parte de esos ejemplos!


Tanto verdadero como falso son palabras clave y como literales tienen un tipo (bool). nullptr es un literal de puntero de tipo std :: nullptr_t, y es un valor pr (no puede tomar la dirección con &), también nullptr es prvalue por lo que no puede tomar su dirección, las constantes literales no se almacenan en su programa.

No tiene sentido tener dirección.


nullptr es una constante (literal), y estos no tienen una dirección de memoria, como cualquier otra constante literal en su código. Es similar a 0 , pero del tipo especial std::nullptr_t lugar de void* para evitar problemas con la sobrecarga (punteros contra enteros).

Pero si define su propia variable con el valor nullptr , tiene una dirección de memoria, por lo que puede tomar su dirección.

Lo mismo vale para cualquier otra constante literal (que en C ++ cae bajo la categoría prvalue ) de cualquier otro tipo, ya que las constantes literales no se almacenan en su programa (solo como partes de expresiones donde ocurren), es por eso que no lo hace tiene sentido hablar de direcciones. Sin embargo, las variables constantes tienen direcciones, para señalar la diferencia.