Recientemente me encontré con el siguiente código esotérico.
int main(){(([](){})());}
Vuelva a formatearlo de la siguiente manera para que sea más legible:
int main(){
(([](){})()); // Um... what?!?!
}
Pero no puedo entender cómo (([](){})())
es el 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 todos los símbolos. Pero se compila en Visual Studio 2010 y no genera nada. No hubo errores ni advertencias. Entonces parece un código válido.
Nunca he visto ningún código válido que es tan extraño fuera de Javascript y C punteros de función .
¿Alguien puede explicar cómo es válido C ++?
Don't sweat it. We have int main(){(([](){})());} which is valid C++"
(9 de noviembre en el chat)Respuestas:
El código esencialmente llama una lambda vacía.
Comencemos desde el principio:
[](){}
es una expresión lambda vacía .Luego, en C y C ++, puede ajustar expresiones en parens y se comportan exactamente igual † como si estuvieran escritas sin ellas, así que eso es lo que hace el primer par de parens alrededor del lambda. Ahora estamos en
([](){})
.Luego,
()
después del primer ajuste, parens llama a la lambda (vacía). Ahora estamos en([](){})()
Toda la expresión está envuelta en parens de nuevo y la obtenemos
(([](){})())
.Por fin,
;
termina la declaración. Llegamos a(([](){})());
.† Hay algunos casos de esquina al menos en C ++, como con
T a_var;
una diferencia entredecltype(a_var)
ydecltype((a_var))
.fuente
B foo(A())
foo es una función (tomar un puntero para que funcione como único parámetro y devolver un B) mientras que enB foo((A()))
foo es un objeto B construido invocando a un constructor a Un objeto (cuya instancia es temporal anónima en este caso).