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
Libérer: 2024-12-24 17:57:19
original
371 Les gens l'ont consulté

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 !
}
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal