Lorsque j’utilise auto
pour déduire un type de pointeur, j’ai trouvé un phénomène étrange. Mon code est comme ceci:
#include using namespace std; int main() { int i = 100; auto p1 = &i; auto *p2 = &i; cout << *p1 << " " << *p2 << endl; return 0; }
Après avoir compilé et exécuté, nous pouvons constater que le résultat de *p1
et *p2
est le même, tous les deux 100. Cela signifie que p1
et p2
sont tous deux un object pointeur qui pointe vers un object int
.
[user@host ~]$ ./test 100 100
Y a-t-il une différence entre ces deux déclarations qui définissent p1
et p2
?
La différence est que dans le premier cas, auto est déduit de int*
alors que dans le second cas, auto est déduit de int
, ce qui fait que p1
et p2
sont de type int*
. Le mécanisme de déduction de type pour auto est équivalent à celui des arguments de modèle. La déduction de type dans votre exemple est donc similaire à
template void foo(T p1); template void bar(T* p2); int main() { int i; foo(&i); bar(&i); }
où les deux fonctions sont instanciées en tant que type void (int *) mais dans le premier cas T
est déduit en int*
tandis que dans le second cas T
a le type int
.
spécificateur auto
utilisé dans les déclarations de variables, déduit son type avec les mêmes règles que celles utilisées dans la déduction des arguments de modèle .
Considérez votre premier exemple (c.-à-d., auto p1 = &i;
). Le type de spécificateur auto
est déduit comme suit:
auto
est remplacé par un paramètre de type de type imaginaire (par exemple, U p1 = &i;
). &i
type &i
est int*
, donc sans surprise et selon les règles de déduction du modèle, U
est déduit de int*
. Considérons maintenant votre deuxième exemple (c.-à-d., auto *p2 = &i
).
auto
est remplacé par un paramètre de modèle de type imaginaire (par exemple, U* p1 = &i;
). &i
type est int*
, donc selon les règles de déduction des modèles, U
est déduit de int
. En tant que tel, dans auto *p2 = &i;
Le type d’espace réservé auto
sera correctement déduit en tant int
et non en tant int*
, ce qui aurait pour résultat que p2
serait de type int**
, comme vous vous en doutiez.