c++ - songs - tag del trap
¿Cuál es la diferencia entre `auto pp` y` auto*ppp`? (2)
En el ejemplo particular que muestra, no hay diferencia. Pero imagina que luego agregarías dos calificativos const
como el siguiente:
const auto pp = p;
const auto *ppp = p;
¿Sigue siendo el mismo? Resulta que esto es idéntico a
int * const pp = p; // pointer is readonly
const int *ppp = p; // pointer is readonly
porque en auto pp = p
, auto
coincide con int*
como un todo, y const
modifica lo que está a su izquierda (o lo que está a su derecha, si no hay nada a su izquierda). Al contrario, en auto *ppp = p
, auto
coincide con int
, y esto es a lo que se aplica const
.
Debido a esta notable diferencia y porque deberíamos usar las variables const
siempre que sea posible, le aconsejaría que siempre use auto*
cuando use la deducción de tipo para las variables de puntero. No hay forma de constar-calificar el puntero en lugar del pointee, y si quiere constar-calificar ambos, esto es posible por
const auto * const pppp = p;
que no funciona sin el *
.
int foo = 11;
int *p = &foo;
auto pp = p;
auto *ppp = p;
cout << pp << endl;
cout << ppp << endl;
Este programa producirá la misma salida para pp
y ppp
, pero ¿por qué? auto
deduce que la variable debe ser int
, por lo que creo que la declaración de ppp
es correcta. Pero pp
y ppp
tienen el mismo valor ...
Salida:
0x61fefc
0x61fefc
No hay diferencia entre auto
y auto *
en este caso particular. En el caso de auto pp = p;
el tipo se deducirá a int *
mientras que en el caso de auto *ppp = p;
tipo se deducirá a int
.
Para las variables, especifica que el tipo de la variable que se está declarando se deducirá automáticamente de su inicializador. [...]
Tenga en cuenta que a diferencia de auto
el auto *
solo deducirá los tipos de puntero.