Maison >développement back-end >C++ >Pourquoi la déduction « automatique » d'une expression Lambda C 11 diffère-t-elle de son type de pointeur de fonction ?

Pourquoi la déduction « automatique » d'une expression Lambda C 11 diffère-t-elle de son type de pointeur de fonction ?

Barbara Streisand
Barbara Streisandoriginal
2024-12-24 17:57:19375parcourir

Why Does `auto` Deduction of a C  11 Lambda Expression Differ from its Function Pointer Type?

Déduction de type d'expression lambda en C 11

En C 11, les expressions lambda sont des outils polyvalents pour créer des fonctions anonymes. Cependant, leur mécanisme de déduction de type sous-jacent n'est pas toujours intuitif.

Considérez l'extrait de code :

#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 !
}

Le code attribue une expression lambda à la fois à un pointeur de fonction et à une variable automatique. Cependant, l’affirmation comparant leurs types échoue. Cela soulève une question : quel est le vrai type d'une expression lambda lorsqu'elle est déduite à l'aide de auto ?

Contrairement à ce à quoi on pourrait s'attendre, les expressions lambda n'ont pas intrinsèquement de type de pointeur de fonction. Au lieu de cela, ils se traduisent en objets foncteurs. Tout ce qui se trouve entre les crochets [] devient des arguments de constructeur et des membres du foncteur, tandis que les paramètres entre () deviennent les paramètres Operator() du foncteur.

Les expressions Lambda qui ne capturent pas les variables (parenthèses [] vides) peuvent être converties en fonction. pointeurs. Cependant, le type sous-jacent du lambda lui-même reste un type de foncteur, qui n'est pas nécessairement le même qu'un pointeur de fonction.

Par conséquent, l'assertion dans l'extrait de code échoue car le type de pFptr est un pointeur de fonction, tandis que le type de pAuto est le type de foncteur généré par l'expression lambda.

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