c++ - examples - awk linux
Uso de auto en C++ 11 (2)
Cuando uso el modo auto
para deducir un tipo de puntero, encontré un fenómeno extraño. Mi código es así:
#include <iostream>
using namespace std;
int main()
{
int i = 100;
auto p1 = &i;
auto *p2 = &i;
cout << *p1 << " " << *p2 << endl;
return 0;
}
Después de compilar y ejecutar, podemos encontrar que el resultado de *p1
y *p2
es el mismo, ambos 100. Esto significa que p1
y p2
son un objeto puntero que apunta a un objeto int
.
[user@host ~]$ ./test
100 100
¿Hay alguna diferencia entre estas dos afirmaciones que definen p1
y p2
?
La diferencia es que en el primer caso el auto se deduce a int*
mientras que en el segundo caso el auto se deduce a int
, lo que hace que p1
y p2
sean de tipo int*
. El mecanismo de deducción de tipo para auto es equivalente al de los argumentos de plantilla. El tipo de deducción en su ejemplo es por lo tanto similar a
template<typename T>
void foo(T p1);
template<typename T>
void bar(T* p2);
int main()
{
int i;
foo(&i);
bar(&i);
}
donde ambas funciones se instancian como tipo void (int *) pero en el primer caso, T
se deduce a int*
mientras que en el segundo caso T
tiene el tipo int
.
auto
especificador auto
utilizado en las declaraciones de variables, deduce su tipo con las mismas reglas que las utilizadas en la deducción de argumentos de plantilla .
Considere su primer ejemplo (es decir, auto p1 = &i;
). El tipo de especificador auto
se deduce de la siguiente manera:
-
auto
se reemplaza con un parámetro de plantilla de tipo imaginario (por ejemplo,U p1 = &i;
). -
&i
type esint*
, por lo tanto sin sorpresas y de acuerdo con las reglas de deducción de la plantillaU
se deduce aint*
.
Ahora considere su segundo ejemplo (es decir, auto *p2 = &i
).
- De nuevo,
auto
se reemplaza con un parámetro de plantilla de tipo imaginario (por ejemplo,U* p1 = &i;
). -
&i
type esint*
, por lo tanto, de acuerdo con las reglas de deducción de la plantilla,U
se deduce aint
.
Como tal, en auto *p2 = &i;
el tipo de marcador de posición auto
se deducirá correctamente como int
y no como int*
, lo que daría como resultado que p2
sea de tipo int**
, como es de esperar.