Maison >développement back-end >C++ >Pourquoi « auto » ne déduit-il pas le type d'une expression Lambda en tant que pointeur de fonction en C 11 ?
Démystifier la déduction de type Lambda avec "auto" en C 11
Dans le domaine du C 11, l'introduction des expressions lambda a soulevé des questions concernant leur type sous-jacent lorsqu'il est déduit à l'aide du mot-clé "auto". L'hypothèse selon laquelle le type d'un lambda est un pointeur de fonction s'avère inexacte, comme le démontre l'extrait de code suivant :
#define LAMBDA [] (int i) -> long { return 0; } int main () { long (*pFptr)(int) = LAMBDA; // ok auto pAuto = LAMBDA; // ok assert(typeid(pFptr) == typeid(pAuto)); // assertion fails! }
Ce code présente l'écart de déduction de type entre un pointeur de fonction et l'expression lambda en utilisant l'option "auto " mot-clé. Curieusement, l'affirmation échoue, révélant que le type du lambda n'est pas un pointeur de fonction.
Dévoilement de la vraie nature des types lambda
Pour comprendre cet apparent paradoxe, il est crucial de reconnaître que le type d'une expression lambda reste non spécifié en C 11. Ils servent de constructions syntaxiques qui se traduisent de manière transparente en foncteurs. Dans cette conversion, les éléments entre crochets ("[]") deviennent des paramètres de constructeur et des membres de classe, tandis que les éléments entre parenthèses deviennent des paramètres pour l'opérateur du foncteur().
Notamment, un lambda sans capture de variable ( crochets vides) possède la capacité d'être converti en pointeur de fonction, une capacité non prise en charge par MSVC2010. Cependant, il reste vital de souligner que bien qu'une telle conversion soit possible, le type inhérent du lambda est un type de foncteur distinct et non spécifié.
Conclusion
L'"auto " Le mot-clé offre une certaine commodité dans la déduction de type, mais il est essentiel de discerner les types sous-jacents des différentes entités linguistiques. Dans le cas des expressions lambda, leur nature non spécifiée et leur potentiel de conversion en pointeurs de fonction (le cas échéant) mettent en évidence la flexibilité offerte par C 11 tout en renforçant également l'importance de comprendre les nuances complexes du langage.
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!