Maison >développement back-end >C++ >Comment `decltype(auto)` améliore-t-il la déduction du type de retour et l'utilisation des modèles en C ?

Comment `decltype(auto)` améliore-t-il la déduction du type de retour et l'utilisation des modèles en C ?

Patricia Arquette
Patricia Arquetteoriginal
2024-12-11 18:48:10685parcourir

How Does `decltype(auto)` Improve Return Type Deduction and Template Usage in C  ?

Utilisations de la fonctionnalité linguistique 'decltype(auto)'

Introduit en C 14, l'idiome 'decltype(auto)' permet ' auto' pour exploiter les règles 'decltype' sur les expressions spécifiées, principalement pour la déduction du type de retour dans les fonctions. Cependant, son utilité s'étend au-delà de ce scénario.

Transfert de type de retour dans le code générique

Pour le code non générique, une sélection explicite de types de retour comme références est possible. Cependant, dans le code générique, 'decltype(auto)' permet un transfert précis du type de retour, que le type de retour soit une référence ou une valeur.

template<class Fun, class... Args>
decltype(auto) Example(Fun fun, Args&&... args) 
{ 
    return fun(std::forward<Args>(args)...); 
}

Retarder la déduction du type de retour dans les modèles récursifs

Lors de la définition de modèles récursifs, 'decltype(auto)' peut reporter la déduction du type de retour jusqu'après le modèle instanciation.

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; }

Applications supplémentaires

Selon le projet de norme N3936, 'decltype(auto)' peut apparaître dans divers contextes, notamment les déclarateurs de fonctions, les spécificateurs de type , et initialisation des variables. Ces contextes sont utiles pour des actions telles que la déduction du type de retour, la désignation d'un espace réservé de type et l'attribution d'une valeur sûre.

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&amp;
auto x5a = f();            // decltype(x5a) is int
decltype(auto) x5d = f();  // decltype(x5d) is int&amp;&amp;

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn