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.
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.