Si je comprends bien, decltype
et auto
tenteront de déterminer le type de quelque chose.
Si on définit:
int foo () {
return 34;
}
Alors les deux déclarations sont légales:
auto x = foo();
cout << x << endl;
decltype(foo()) y = 13;
cout << y << endl;
Pourriez-vous me dire quelle est la principale différence entre decltype
et auto
?
decltype
donne le type déclaré de l'expression qui lui est transmise. auto
fait la même chose que la déduction de type de modèle. Ainsi, par exemple, si vous avez une fonction qui renvoie une référence, auto
sera toujours une valeur (vous aurez besoin de auto&
pour obtenir une référence), mais decltype
sera exactement le type de la valeur de retour.
#include <iostream>
int global{};
int& foo()
{
return global;
}
int main()
{
decltype(foo()) a = foo(); //a is an `int&`
auto b = foo(); //b is an `int`
b = 2;
std::cout << "a: " << a << '\n'; //prints "a: 0"
std::cout << "b: " << b << '\n'; //prints "b: 2"
std::cout << "---\n";
decltype(foo()) c = foo(); //c is an `int&`
c = 10;
std::cout << "a: " << a << '\n'; //prints "a: 10"
std::cout << "b: " << b << '\n'; //prints "b: 2"
std::cout << "c: " << c << '\n'; //prints "c: 10"
}
Voir également la réponse de David Rodríguez sur les endroits où un seul parmi auto
ou decltype
est possible.
auto
(dans le contexte où il en déduit un type) est limité à la définition du type d'une variable pour laquelle il existe un initialiseur. decltype
est une construction plus large qui, au prix d'informations supplémentaires, induira le type d'une expression.
Dans les cas où auto
peut être utilisé, il est plus concis que decltype
, car vous n'avez pas besoin de fournir l'expression à partir de laquelle le type sera déduit.
auto x = foo(); // more concise than `decltype(foo()) x`
std::vector<decltype(foo())> v{ foo() }; // cannot use `auto`
Le mot clé auto
est également utilisé dans un contexte totalement indépendant lorsque des types de retour de fin sont utilisés pour les fonctions:
auto foo() -> int;
auto
n’est qu’un leader pour que le compilateur sache qu’il s’agit d’une déclaration avec un type de retour final. Bien que l’exemple ci-dessus puisse être converti trivialement en style ancien, il est utile, en programmation générique:
template <typename T, typename U>
auto sum( T t, U u ) -> decltype(t+u)
Notez que dans ce cas, auto
ne peut pas être utilisé pour définir le type de retour.
Généralement, si vous avez besoin d’un type pour une variable à initialiser, utilisez auto . decltype est mieux utilisé lorsque vous avez besoin du type pour quelque chose qui n'est pas une variable, comme un type de retour.