Maison > développement back-end > C++ > Quelles sont les applications pratiques de `decltype(auto)` en C ?

Quelles sont les applications pratiques de `decltype(auto)` en C ?

Barbara Streisand
Libérer: 2024-12-10 06:03:16
original
511 Les gens l'ont consulté

What are the practical applications of `decltype(auto)` in C  ?

Quelles sont certaines utilisations de decltype(auto) ?

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

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

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)...); 
}
Copier après la connexion

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

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; }
Copier après la connexion

Autres utilisations

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)
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal