Maison >développement back-end >C++ >Quel est le vrai type d'une expression Lambda C 11 ?

Quel est le vrai type d'une expression Lambda C 11 ?

Susan Sarandon
Susan Sarandonoriginal
2024-12-10 10:06:12284parcourir

What is the True Type of a C  11 Lambda Expression?

Inférence de type Lambda avec "auto" en C 11

Le type d'expression lambda en C 11 est sujet à débat, avec certains croyant qu'il s'agit d'un pointeur de fonction. Cependant, considérons la démonstration suivante :

#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 contredit l'hypothèse selon laquelle les lambdas ont un type de pointeur de fonction. Alors, quelle est la véritable nature de leur type ?

Dévoilement de la véritable identité des Lambda

Contrairement à la croyance populaire, les expressions lambda ont un type non spécifié. Ce sont simplement des commodités syntaxiques pour les foncteurs. Lors de la compilation, un lambda se transforme en foncteur :

  • Les éléments entre crochets [] deviennent des paramètres de constructeur et des membres d'objet foncteur.
  • Les paramètres entre () sont convertis en paramètres pour le opérateur du foncteur().

Lambdas sans capture de variable (parenthèses [] vides) peuvent techniquement être convertis en pointeurs de fonction. Cependant, cette conversion n'est pas prise en charge par tous les compilateurs (par exemple, MSVC2010).

Distinction importante

Bien qu'un lambda qui ne capture aucune variable puisse agir comme un pointeur de fonction, son type sous-jacent reste indéterminé. Ce n'est pas un pointeur de fonction mais plutôt un type de foncteur non spécifié.

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