funciones examples c++ c++11 lambda syntax

funciones - lambda examples c++



¿Cómo es "int main(){(([](){})())}" válido C++? (1)

El código esencialmente llama a un lambda vacío.

Comencemos por el principio: [](){} es una expresión lambda vacía.

Luego, en C y C ++, puedes envolver expresiones en parens y se comportan exactamente igual que si estuvieran escritas sin ellas, así que eso es lo que hace el primer par de parens alrededor de la lambda. Ahora estamos en ([](){}) .

Luego, () después de la primera envoltura de parens llama a la lambda (vacía). Ahora estamos en ([](){})()

La expresión completa está envuelta en parens nuevamente y obtenemos (([](){})()) .

Por fin ; termina la declaración. Llegamos a (([](){})()); .

† Hay algunos casos de esquina al menos en C ++, como con T a_var; hay una diferencia entre decltype(a_var) y decltype((a_var)) .

Recientemente me encontré con la siguiente pieza de código esotérico.

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

Reformatéelo de la siguiente manera para hacerlo más legible:

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

Pero no puedo entender cómo (([](){})()) es un código válido.

  • No parece la sintaxis de puntero de función.
  • No puede ser un truco de sobrecarga del operador. El código se compila como es.

Google no ayudó mucho con esta búsqueda de todos los símbolos. Pero se compila en Visual Studio 2010 y no produce nada. No hubo errores, ni advertencias. Así que parece un código válido.

Nunca he visto ningún código válido que sea tan extraño fuera de los punteros de función de Javascript y C.

¿Alguien puede explicar cómo esto es válido C ++?