Maison >développement back-end >C++ >Pourquoi l'ajout d'un opérateur unaire ' ' autorise-t-il la réaffectation Lambda en C ?

Pourquoi l'ajout d'un opérateur unaire ' ' autorise-t-il la réaffectation Lambda en C ?

DDD
DDDoriginal
2024-12-20 06:38:10199parcourir

Why Does Adding a Unary

Un Lambda positif : '[]{}' - Plonger dans l'inattendu

Pour tenter d'enquêter sur la nature énigmatique des expressions lambda , la question de "Redéfinir les lambdas non autorisés en C 11, pourquoi ?" est apparu. Une découverte particulière de Johannes Schaub a révélé que l'ajout d'un opérateur unaire avant le lambda initial lui permet de se compiler.

La requête :

Pourquoi le code suivant se compile-t-il sans erreurs :

int main() {
    auto test = +[]{}; // Note the unary operator + before the lambda
    test = []{};
}

Ce comportement est-il conforme aux standards C ?

Le Dévoilement :

Oui, le code est conforme aux normes C. L'opérateur déclenche remarquablement une conversion du lambda en un simple pointeur de fonction.

Le dépliage :

Le compilateur interprète le lambda initial ([]{}) et crée un objet de fermeture. Étant donné que ce lambda ne capture aucune variable, une fonction de conversion existe pour convertir l'objet de fermeture en un pointeur de fonction avec des paramètres et un type de retour identiques à ceux de l'opérateur d'appel de fonction de la fermeture.

Cette conversion s'aligne sur l'exigence de l'unaire. opérateur. Les surcharges intégrées pour en incluent une qui convertit n'importe quel type T en pointeur vers T. Le type de fermeture remplit cette exigence en fournissant une conversion en pointeur de fonction.

Par conséquent, l'expression auto test = []{ } ; en déduit le type de test à annuler (*)(). Cela permet l'affectation ultérieure dans la deuxième ligne, où le deuxième objet lambda/closure subit également la conversion en pointeur de fonction, ce qui entraîne une affectation compatible.

Signification :

Ce comportement inhabituel met en évidence la polyvalence des expressions lambda et les mécanismes complexes du langage C. Il permet la réaffectation des expressions lambda en les convertissant en pointeurs de fonction, offrant ainsi des possibilités de flexibilité et d'optimisation du code.

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