c++ - son - ¿Cómo es que la inicialización del valor "int*ptr=int()" no es ilegal?
tipos de datos en c++ y su significado (5)
Desde n3290 (C ++ 03 utiliza texto similar), 4.10 Conversiones de puntero [conv.ptr] párrafo 1 (el énfasis es mío):
1 Una constante de puntero nulo es una expresión de constante integral (5.19) prvalue de tipo entero que evalúa a cero o un prvalue de tipo std :: nullptr_t. Una constante de puntero nulo se puede convertir a un tipo de puntero; el resultado es el valor de puntero nulo de ese tipo y se puede distinguir de cualquier otro valor de puntero de objeto o tipo de puntero de función. Tal conversión se llama conversión de puntero nulo. [...]
int()
es un valor prmanente de expresión constante integral de tipo entero que se evalúa como cero (¡es engorroso!) y, por lo tanto, se puede utilizar para inicializar un tipo de puntero. Como puede ver, 0
no es la única expresión integral que tiene envoltura especial.
El siguiente código (tomado de aquí ):
int* ptr = int();
compila en Visual C ++ e inicializa el valor del puntero.
¿Cómo es eso posible? Quiero decir que int()
produce un objeto de tipo int
y no puedo asignar un int
a un puntero.
¿Cómo es que el código anterior no es ilegal?
La expresión int()
evalúa como un entero inicializado por defecto constante, que es el valor 0. Ese valor es especial: se usa para inicializar un puntero al estado NULO.
Porque int()
produce 0
, que es intercambiable con NULL
. NULL
sí mismo se define como 0
, a diferencia de C NULL
que es (void *) 0
.
Tenga en cuenta que esto sería un error:
int* ptr = int(5);
y esto seguirá funcionando:
int* ptr = int(0);
0
es un valor constante especial y, como tal, se puede tratar como un valor de puntero. Las expresiones constantes que producen 0
, como 1 - 1
están permitidas como constantes de puntero nulo.
Well int no es un objeto.
Creo que lo que está sucediendo aquí es que le está diciendo a la int * que apunte a alguna dirección de memoria determinada por int ()
entonces si int () crea 0, int * apuntará a la dirección de memoria 0
int()
es una expresión constante con un valor de 0, por lo que es una forma válida de producir una constante de puntero nulo. En última instancia, es solo una forma ligeramente diferente de decir int *ptr = NULL;