¿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++?
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))
.
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