Les expressions étranges C ++ sont compilées très bien

Pourquoi les expressions C ++ valides suivantes? Ce ne sont pas des lambda

[]{}(); {}[]{}; 

Quelqu’un peut-il me les expliquer?

Le premier est un lambda sans liste de parameters et un appel ultérieur. []{} est équivalent à [](){} donc la ligne entière est équivalente à

 [](){}(); 

La seconde est une paire d’accolades, qui introduisent puis ferment immédiatement une scope, suivie d’une définition lambda inutilisée sans liste de parameters:

 { // empty scope } []{}; // lambda 

Vous pouvez vous référer à http://fr.cppreference.com/w/cpp/language/lambda pour les variantes de la syntaxe de définition lambda.

  • Celui-ci est un appel lambda

     []{}(); 

    c’est équivalent à

     [](){}(); 
  • La seconde est une étendue vide, suivie d’un lambda (non utilisé).

Les parens sont facultatifs pour lambda sans paramètre.