tipos - dynamic_cast c++ ejemplo
¿Cómo se distingue 0 de otros enteros al inicializar nullptr_t? (3)
Según tengo entendido, std::nullptr_t
puede inicializarse desde nullptr
así como desde 0
. Pero al mismo tiempo, la tercera inicialización a continuación no funciona, a pesar de que 5
tiene el mismo tipo que 0
:
#include <memory>
int main()
{
std::nullptr_t null1=0;
std::nullptr_t null2=nullptr;
std::nullptr_t null3=5; // error: cannot convert ‘int’ to ‘std::nullptr_t’ in initialization
}
¿Como funciona esto? Es decir, ¿cómo distingue la biblioteca estándar de 0
a 5
en el momento de la compilación, si estos literales no son argumentos de plantilla?
¿Se puede crear una clase personalizada que pueda distinguir de manera similar los argumentos de su constructor en el momento de la compilación, sin usar std::nullptr_t
para esto?
¿Cómo distingue la biblioteca estándar 0 de 5 en el momento de la compilación, si estos literales no son argumentos de plantilla?
Esto no tiene nada que ver con la biblioteca estándar, nullptr_t
es un tipo integrado conocido por el compilador, y obviamente el compilador conoce la diferencia entre 5
y 0
¿Se puede crear una clase personalizada que pueda distinguir de manera similar los argumentos de su constructor en el momento de la compilación, sin usar
std::nullptr_t
para esto?
En general no.
Puede escribir un tipo que se puede inicializar desde 0
y no desde 5
haciendo que tome un argumento de tipo puntero, porque 0
es una constante de puntero nula válida, pero 5
no. Pero no se puede escribir un tipo que se pueda construir a partir de 3
y no a partir de 5
, o cualquier otra cosa así.
N3337 [conv.ptr]/1:
una constante de puntero nulo es una expresión constante prvalue de tipo entero que se evalúa a cero o un prvalue de tipostd::nullptr_t
. Una constante de puntero nula se puede convertir en un tipo de puntero; el resultado es el valor de puntero nulo de ese tipo y se distingue de todos los demás valores del puntero de objeto o del tipo de puntero de función. Dicha conversión se denomina conversión de puntero nulo. Dos valores de puntero nulo del mismo tipo se compararán iguales. La conversión de una constante de puntero nulo a un puntero a un tipo calificado de CV es una conversión única, y no la secuencia de una conversión de puntero seguida de una conversión de calificación. Una constante de puntero nula de tipo integral se puede convertir en un prvalue de tipostd::nullptr_t
.
0
es una constante de puntero nulo de tipo integral, por lo que se puede convertir en un prvalue de tipo std::nullptr_t
. 5
no es una constante de puntero nulo, por lo que no puede ser.
A nullptr_t
solo se le puede asignar el valor nullptr
o 0
que se convierte implícitamente.
Según N4296 (pág.86):
4.10 conversiones de puntero
Una constante de puntero nula es un literal entero con valor cero o un valor predeterminado de tipo
std::nullptr_t
. Una constante de puntero nula se puede convertir en un tipo de puntero; el resultado es el valor de puntero nulo de ese tipo y se distingue de todos los demás valores del puntero de objeto o del tipo de puntero de función. [...] Una constante de puntero nulo de tipo integral se puede convertir a un valor predeterminado de tipostd::nullptr_t
.
No puedes crear un tipo similar dentro de C ++ por ti mismo.
std::nullptr_t
se implementa como un tipo incorporado y el compilador aplica sus propiedades distintas.
EDIT: párrafo fijo en los tipos incorporados. Gracias Yakk!