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 = []{}; }
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!