¿Cómo es " int principal(){(([](){})());}" ¿c++válido?


Recientemente me encontré con el siguiente fragmento de código esotérico.

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

Reformatearlo de la siguiente manera para que sea más legible:

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

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

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

Google no ayudó mucho con esta búsqueda de símbolos. Pero compila en Visual Studio 2010 y no produce nada. Había sin 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 Javascript y C punteros de función.

¿Puede alguien explicar cómo es válido C++?

Author: Nicky C, 2012-11-28

1 answers

El código esencialmente llama a una lambda vacía.

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

Entonces, en C y C++, puede envolver expresiones en paréntesis y se comportan exactamente igual como si estuviera escrito sin ellos, así que eso es lo que hace el primer par de paréntesis alrededor de la lambda. Ahora estamos en ([](){}).

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

El conjunto la expresión se envuelve en paréntesis de nuevo y obtenemos (([](){})()).

Finalmente, ; 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)).

 257
Author: Xeo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:25:45