L'idiome decltype(auto) en C 14 permet la déduction du type d'une variable à partir d'une expression donnée. Bien que son utilisation principale soit de permettre aux déclarations automatiques d'adhérer aux règles decltype, il existe plusieurs autres applications utiles pour cette fonctionnalité.
Dans le code générique, il est crucial de transmettre parfaitement les types de retour sans savoir au préalable si la valeur de retour est une référence ou une valeur. decltype(auto) fournit cette fonctionnalité :
template<class Fun, class... Args> decltype(auto) Example(Fun fun, Args&&... args) { return fun(std::forward<Args>(args)...); }
Lors de la définition de modèles récursifs, une récursivité infinie lors de l'instanciation peut se produire si le type de retour est déclaré comme decltype(...) au lieu de decltype(auto). Ce dernier permet de retarder la déduction du type de retour jusqu'après l'instanciation du modèle :
template<int i> struct Int {}; constexpr auto iter(Int<0>) -> Int<0>; template<int i> constexpr auto iter(Int<i>) -> decltype(auto) { return iter(Int<i-1>{}); } int main() { decltype(iter(Int<10>{})) a; }
decltype(auto) peut également être utilisé dans divers autres contextes , y compris l'initialisation des variables :
int i; int&& f(); auto x3a = i; // decltype(x3a) is int decltype(auto) x3d = i; // decltype(x3d) is int auto x4a = (i); // decltype(x4a) is int decltype(auto) x4d = (i); // decltype(x4d) is int& auto x5a = f(); // decltype(x5a) is int decltype(auto) x5d = f(); // decltype(x5d) is int&& auto x6a = { 1, 2 }; // decltype(x6a) is std::initializer_list<int> decltype(auto) x6d = { 1, 2 }; // error, { 1, 2 } is not an expression auto *x7a = &i; // decltype(x7a) is int* decltype(auto)*x7d = &i; // error, declared type is not plain decltype(auto)
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!