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 ?

Pourquoi « auto » ne déduit-il pas le type d'une expression Lambda en tant que pointeur de fonction en C 11 ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-12-08 03:59:09292parcourir

Why Doesn't `auto` Deduce a Lambda Expression's Type as a Function Pointer in 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!

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