Lambdas génériques en C 14 : une plongée plus approfondie
L'avènement des lambdas génériques en C 14 a introduit une nouvelle fonctionnalité dans les expressions lambda, permettant pour les fonctions avec des types d'arguments déduits automatiquement. Cependant, le mécanisme de fonctionnement de ces génériques a fait l'objet de spéculations.
Contrairement aux hypothèses initiales, les lambdas génériques ne s'appuient pas sur des modèles C pour leur implémentation. Au lieu de cela, ils suivent une approche unique impliquant un opérateur d'appel modélisé pour le type de fermeture du lambda.
Par exemple, l'expression lambda générique :
auto glambda = [](auto a) { return a; };
produit un type de fermeture avec le suivant opérateur d'appel basé sur un modèle :
class /* unnamed */ { public: template <typename T> T operator () (T a) const { return a; } };
L'opérateur d'appel est modélisé sur la base d'un paramètre de modèle de type inventé pour chaque instance d'auto dans le paramètre lambda déclaration. Ces paramètres permettent au type déduit de varier à chaque invocation du lambda.
Cette approche basée sur un modèle diffère des modèles C, qui génèrent de nouvelles fonctions pour chaque type d'argument unique. Au lieu de cela, il fonctionne davantage comme les génériques de Java, où l'effacement de type sous-jacent permet une implémentation efficace sans nécessiter de générations de fonctions spécialisées.
En résumé, les lambdas génériques en C 14 exploitent un opérateur d'appel basé sur un modèle plutôt que des modèles C traditionnels. Ce choix de conception établit un équilibre entre puissance expressive et optimisation, offrant un moyen pratique de travailler avec des fonctions avec des types d'arguments déduits automatiquement.
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!