2016-09-18 1 views
3

Dans le code ci-dessous je ne pouvais pas comprendre comment auto vient de savoir que chose sur le côté droit est le pointeur:Comment auto déduit le type de pointeur?

int x = 100; 
int *ptr = & x; 
auto test = ptr; 
std::cout<<*test<<std::endl; 

Parce que par mon pointeur compréhension contient l'adresse qui n'est unsigned int alors comment auto en déduit qu'il soit pointeur mais pas unsigned int?

+5

_pointer contient une adresse qui n'est rien d'autre qu'un entier non signé. C'est faux. Une adresse n'est pas nécessairement un int non signé. – Raman

+2

_Le type d'une variable déclarée avec auto est déduit de son initialiseur_. C'est tout. – skypjack

+0

donc ici l'initialiseur est ptr donc comment il doit savoir qu'il doit être pointeur et pas d'autre type – Kapil

Répondre

6

vous pouvez également poser la question: « finalement, tout dans mon programme est octets, alors pourquoi ne auto ne déduisent pas tout à être uint8_t[]? »

Eh bien, c'est simple. le type de ptr est int*. Le type de test est également int*. Peu importe à quoi ressemble l'assemblage généré. Il se peut que le processeur traite int* et unsigned int de la même manière, mais cela n'a pas d'importance pour C++, car C++ est un langage de haut niveau . En plus de cela,

. l'instruction sous-jacente selon laquelle "un pointeur est un entier non signé" n'est pas vraie. pointeur est un type qui permet de lire et d'écrire dans l'adresse mémoire contenue dans cette variable. un int non signé est ... un entier non signé. ni plus ni moins.

+0

mais la même chose ne fonctionne pas pour les références si ptr est int et alors test est int pourquoi? – Kapil

+1

@Kapil Ceci est une question différente, sans rapport. –

+1

@Kapil Voilà comment fonctionne la déduction automatique. Vous devrez utiliser 'decltype (auto)' pour obtenir 'int &'. – Rakete1111

3

La norme dit:

Le type d'une variable déclarée à l'aide automatique est déduite de sa initialiseur.

Ainsi, le type de test est déduit de celui de ptr (qui est initialiseur) et il est int *.

Notez que auto suit presque les mêmes règles de déduction de type de modèle.
Vous pouvez vous référer à eux pour plus de détails sur les différences entre auto, auto&, const auto &, auto&& et ainsi de suite.

+0

donc juste curieux de savoir que si ce n'est que de l'initialiseur alors pourquoi ces 4 octets sont considérés comme pointeur mais non signé int ou un autre type – Kapil

+1

@Kapil parce que le type de 'ptr' est' int * 'et non' unsigned int'. –

+0

donc vous voulez dire auto revient en arrière et vérifier la déclaration et à partir de cela en déduire que ptr est int * donc test devrait également être int * – Kapil