web-dev-qa-db-fra.com

Qu'est-ce que le decltype et comment est-il utilisé?

Je n'ai pas pu trouver une bonne explication du decltype. Veuillez me dire, en tant que programmeur débutant, ce qu'il fait et pourquoi il est utile.

Par exemple, je lis un livre qui a posé la question suivante. Quelqu'un peut-il m'expliquer la réponse et pourquoi, ainsi que de bons exemples (niveau débutant)?

Quel serait le type de chaque variable et quelle valeur aurait chaque variable à la fin du code?

int a = 3, b = 4;    
decltype(a) c = a;

decltype((b)) d = a; 

++c; 

++d;

Une explication ligne par ligne serait très utile.

45
Olpers

decltype est un moyen de spécifier un type: vous lui donnez expression, et decltype vous donne un type qui correspond au type de l'expression. Plus précisément, decltype(e) est le type suivant:

  • Si e est le nom d'une variable, c'est-à-dire une "id-expression", alors le type résultant est le type de la variable.

  • Sinon, si e correspond à une valeur l de type T, le type résultant est T &, Et si e correspond à une valeur r de type T, le type résultant est T.

La combinaison de ces règles avec des règles de réduction de référence vous permet de donner un sens à decltype(e) &&, qui est toujours une référence "appropriée". (C++ 14 ajoute également decltype(auto) pour vous donner la déduction de type de auto combinée avec la sémantique de catégorie de valeur de decltype.)

Exemples:

int foo();
int n = 10;

decltype(n) a = 20;             // a is an "int" [id-expression]

decltype((n)) b = a;            // b is an "int &" [(n) is an lvalue]

decltype(foo()) c = foo();      // c is an "int" [rvalue]

decltype(foo()) && r1 = foo();  // int &&
decltype((n)) && r2 = n;        // int &

Il peut être utile de souligner la différence entre auto et decltype: auto fonctionne sur types et decltype fonctionne sur - expressions.

Vous ne devriez pas voir ou utiliser decltype dans la programmation "au jour le jour". Il est très utile dans le code de bibliothèque générique (basé sur un modèle), où l'expression en question n'est pas connue et dépend d'un paramètre. (En revanche, auto peut être utilisé généreusement partout.) En bref, si vous êtes nouveau dans la programmation, vous n'aurez probablement pas besoin d'utiliser decltype pendant un certain temps.

67
Kerrek SB