Maison >développement back-end >C++ >Pourquoi « []{} » active-t-il la compilation d'expressions Lambda en C ?

Pourquoi « []{} » active-t-il la compilation d'expressions Lambda en C ?

Barbara Streisand
Barbara Streisandoriginal
2024-12-24 18:21:18637parcourir

Why Does

Percer le mystère de ' ' avec des expressions Lambda : ' []{}'

Dans une question précédente sur Stack Overflow, une expression lambda apparemment simple n'a pas pu être compilée. Cependant, avec l'ajout d'un opérateur ' ' avant le lambda, le code a miraculeusement acquis sa capacité à se compiler. Cette observation intrigante pose la question : pourquoi ' []{}' fonctionne-t-il ?

La clé réside dans le comportement surchargé de l'opérateur ' '. Lorsqu'il est appliqué à un objet de fermeture généré par un lambda non capturant, il invoque une fonction de conversion intégrée qui transforme la fermeture en un simple pointeur de fonction.

Cette conversion est cruciale car l'opérateur ' ' a un candidat surcharge qui convertit n’importe quel type en pointeur. Par conséquent, l'application de ' ' à l'objet de fermeture entraîne un pointeur de fonction vers le lambda.

Le type de 'test' après la déclaration du premier lambda devient void(*)(), qui est un pointeur de fonction avec un type de retour void et aucun paramètre. Cela permet au deuxième lambda d'être affecté à « test », malgré un type de fermeture différent.

Par conséquent, la fonctionnalité du code peut être expliquée comme suit :

  1. Le premier lambda est converti en pointeur de fonction à l'aide de l'opérateur ' '.
  2. Le type de 'test' devient un pointeur de fonction void(*)().
  3. Le deuxième lambda est également converti en pointeur de fonction, garantissant la compatibilité avec 'test'.
  4. L'affectation à 'test' réussit car les deux pointeurs de fonction sont compatibles .

Ce comportement est entièrement conforme à la norme C, ce qui fait de ' []{}' une astuce valide et étonnamment utile pour lambda. expressions.

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