J'ai récemment rencontré le morceau de code ésotérique suivant.
int main(){(([](){})());}
Reformatez-le comme suit pour le rendre plus lisible:
int main(){
(([](){})()); // Um... what?!?!
}
Mais je ne peux pas comprendre comment (([](){})())
est un code valide.
- Il ne ressemble pas à la syntaxe du pointeur de fonction.
- Cela ne peut pas être une astuce de surcharge de l'opérateur. Le code se compile tel quel.
Google n'a pas beaucoup aidé avec cette recherche de tous les symboles. Mais il se compile dans Visual Studio 2010 et ne produit rien. Il n'y a eu aucune erreur et aucun avertissement. Cela ressemble donc à du code valide.
Je ne l' ai jamais vu un code valide qui est si bizarre à l' extérieur de Javascript et des pointeurs de fonction C .
Quelqu'un peut-il expliquer en quoi c'est un C ++ valide?
Don't sweat it. We have int main(){(([](){})());} which is valid C++"
(9 novembre dans le chat)Réponses:
Le code appelle essentiellement un lambda vide.
Commençons par le début:
[](){}
est une expression lambda vide .Ensuite, en C et C ++, vous pouvez encapsuler des expressions dans des parens et elles se comportent exactement de la même manière † que si elles étaient écrites sans elles, c'est donc ce que fait la première paire de parens autour du lambda. Nous y sommes maintenant
([](){})
.Ensuite,
()
après le premier wrapping, la parens appelle la lambda (vide). Nous en sommes maintenant à([](){})()
L'expression entière est à nouveau enveloppée de parens et nous obtenons
(([](){})())
.Enfin,
;
termine la déclaration. Nous arrivons à(([](){})());
.† Il y a des cas d'angle au moins en C ++, comme avec
T a_var;
il y a une différence entredecltype(a_var)
etdecltype((a_var))
.la source
B foo(A())
foo est une fonction (en prenant un pointeur pour fonctionner comme seul paramètre et en retournant un B) tandis que dansB foo((A()))
foo est un objet B construit invoquant un constructeur prenant a Un objet (dont l'instance est un temporaire anonyme dans ce cas).