284 votes

Comment un "int main(){(([](){})());}" valide en C++?

Je suis récemment tombé sur la suite ésotérique morceau de code.

int main(){(([](){})());}

Le reformater comme suit afin de le rendre plus lisible:

int main(){
    (([](){})());   //  Um... what?!?!
}

Mais je ne peux pas obtenir ma tête autour de la façon dont (([](){})()) est valable code.

  • Il ne ressemble pas à la fonction de pointeur de la syntaxe.
  • Il ne peut pas être certains de surcharge d'opérateur truc. Le code se compile comme il est.

Google n'a pas beaucoup d'aide avec ce symbole de la recherche. Mais il compile dans Visual Studio 2010 et sorties de rien. Il n'y avait pas d'erreurs, et pas de mises en garde. Donc, il semble que le code est valide.

Je n'ai jamais vu aucun code valide, c'est tellement bizarre à l'extérieur de Javascript et C pointeurs de fonction.

Quelqu'un peut m'expliquer comment cela est valable en C++?

293voto

Xeo Points 69818

Le code appelle essentiellement un vide lambda.

Commençons par le début: [](){} est vide expression lambda.

Puis, en C et C++, vous pouvez envelopper les expressions dans les parens et ils se comportent exactement de la même comme si elle était écrite sans eux, c'est ce que la première paire de parenthèses autour de la lambda. Nous sommes maintenant à la ([](){}).

Ensuite, () après le premier emballage parens appels (vide) lambda. Nous sommes maintenant à la ([](){})()

L'expression complète est enveloppé dans des parens de nouveau et nous obtenons (([](){})()).

Au dernier, ; termine la déclaration. Nous arrivons à l' (([](){})());.


† Il y a certains cas de coin au moins en C++, comme avec T a_var; il y a une différence entre decltype(a_var) et decltype((a_var)).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X