Maison > développement back-end > C++ > Pourquoi ` []{}` active-t-il la réaffectation Lambda en C ?

Pourquoi ` []{}` active-t-il la réaffectation Lambda en C ?

Linda Hamilton
Libérer: 2024-12-28 05:34:09
original
264 Les gens l'ont consulté

Why Does ` []{}` Enable Lambda Reassignment in C  ?

Décoder l'opérateur magique " " : Comprendre le " " Lambda

Dans une observation déroutante, un seul préfixe " " à une expression lambda en C permet miraculeusement sa réaffectation. Cette sorcellerie énigmatique a soulevé la question : pourquoi le code suivant se compile-t-il avec succès ?

int main() {
    auto test = +[]{}; // The "+" operator casts a lambda to a function pointer
    test = []{};
}
Copier après la connexion

La réponse réside dans les profondeurs obscures du standard C. Le " " déclenche une conversion en un ancien pointeur de fonction pour le lambda. Le lambda, étant non capturant, possède intrinsèquement une fonction de conversion en pointeur de fonction avec une signature identique. Cette fonction de conversion, telle que définie dans le standard C, renvoie l'adresse d'une fonction qui se comporte de manière identique à l'opérateur d'appel de fonction du lambda.

L'opérateur unaire " ", lorsqu'il est appliqué à l'objet de fermeture généré par le lambda, engage un ensemble de surcharges intégrées. L'une de ces surcharges accepte n'importe quel type de pointeur et le convertit en pointeur de fonction. La conversion du type de fermeture en pointeur de fonction, seule fonction candidate surchargée, est donc prioritaire.

Par conséquent, le type de "test" dans "auto test = []{};" est déduit être "void(*)()". Cette compatibilité de pointeur de fonction permet l'affectation d'un deuxième objet lambda/closure à "tester" même si leurs types de fermeture diffèrent.

Cette connaissance dévoile le secret derrière le succès du lambda "[]{}". En convertissant le lambda en pointeur de fonction, il contourne la restriction relative à la redéfinition des lambdas, déverrouillant ainsi la possibilité d'attribuer un nouvel objet 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