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:
-
autose reemplaza con un parámetro de plantilla de tipo imaginario (por ejemplo,U p1 = &i;). -
&itype esint*, por lo tanto sin sorpresas y de acuerdo con las reglas de deducción de la plantillaUse deduce aint*.
Ahora considere su segundo ejemplo (es decir, auto *p2 = &i ).
- De nuevo,
autose reemplaza con un parámetro de plantilla de tipo imaginario (por ejemplo,U* p1 = &i;). -
&itype esint*, por lo tanto, de acuerdo con las reglas de deducción de la plantilla,Use 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.