45 votes

Utilisation de auto en C ++11

Lorsque j'utilise auto d'en déduire un type pointeur, j'ai trouvé un étrange phénomène. Mon code ressemble à ceci:

#include <iostream>
using namespace std;
int main()
{
    int i = 100;
    auto p1 = &i;
    auto *p2 = &i;

    cout << *p1 << " " << *p2 << endl;

    return 0;
}

Après la compilation et l'exécution, nous pouvons constater que le résultat d' *p1 et *p2 est le même, les deux 100. Cela signifie p1 et p2 sont à la fois un pointeur sur un objet qui renvoie à une int objet.

[user@host ~]$ ./test 
100 100

Quelle est la différence entre ces deux énoncés qui définissent p1 et p2?

84voto

nh_ Points 242

La différence est que dans le premier cas, l'auto est déduit d' int* alors que dans le second cas, l'auto est déduit d' int, ce qui se traduit dans les deux p1 et p2 étant de type int*. Le type de mécanisme de déduction automatique est équivalente à celle des arguments de modèle. Le type de déduction dans votre exemple est donc similaire à

template<typename T>
void foo(T p1);

template<typename T>
void bar(T* p2);

int main()
{
    int i;
    foo(&i);
    bar(&i);
}

lorsque les deux fonctions sont instanciés comme type void(int*), mais dans le premier cas T est déduit d' int* alors que dans le second cas T type int.

19voto

40two Points 8224

auto spécificateur utilisé dans les déclarations de variables, déduit de son type les mêmes règles que celles utilisées dans le modèle argument déduction.

Considérez votre premier exemple (c'est à dire, auto p1 = &i;). Le type de auto spécificateur est déduite comme suit:

  1. auto est remplacé par un imaginaire type de paramètre du modèle (par exemple, U p1 = &i;).
  2. &i type int*, donc sans surprises et selon le modèle de règles de déduction U est déduit d' int*.

Considérons maintenant votre deuxième exemple (c'est à dire, auto *p2 = &i).

  1. Nouveau auto est remplacé par un imaginaire type de paramètre du modèle (par exemple, U* p1 = &i;).
  2. &i type int*, donc selon le modèle de règles de déduction U est déduit d' int.

En tant que tel, en auto *p2 = &i; l'espace réservé de type auto va être correctement déduit que int et non en tant que int*, qui seraient le résultat d' p2 étant de type int**, comme vous l'avez prévu.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X