examples c++ c++11 auto

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:

  1. auto se reemplaza con un parámetro de plantilla de tipo imaginario (por ejemplo, U p1 = &i; ).
  2. &i type es int* , por lo tanto sin sorpresas y de acuerdo con las reglas de deducción de la plantilla U se deduce a int* .

Ahora considere su segundo ejemplo (es decir, auto *p2 = &i ).

  1. De nuevo, auto se reemplaza con un parámetro de plantilla de tipo imaginario (por ejemplo, U* p1 = &i; ).
  2. &i type es int* , por lo tanto, de acuerdo con las reglas de deducción de la plantilla, U se deduce a int .

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.