¿Cómo es “int main(){(([](){})());}” C++ válido?

3 minutos de lectura

avatar de usuario
místico

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 un código válido.

  • No parece una sintaxis de puntero de función.
  • No puede ser algún truco de sobrecarga de operadores. 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 sea tan extraño fuera de los punteros de funciones de Javascript y C.

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

  • ¡Oye! Eso es mio. “Don't sweat it. We have int main(){(([](){})());} which is valid C++" (9 de noviembre en el chat)

    – seje

    28 de noviembre de 2012 a las 10:50


  • es un cierre lambda c ++ 11

    usuario1773602

    28 de noviembre de 2012 a las 10:51

  • @Mysticial: este código te desconcierta porque es inútil. Si esta lambda hiciera algo, reconocería que tiene una sintaxis similar a los punteros de función (con los que está estrechamente relacionado).

    – S Chepurin

    28 de noviembre de 2012 a las 11:25


  • @Mysticial – “6 años de C ++”: las lambdas se agregaron recientemente en C ++ 11, por lo que nadie tiene experiencia con ellas antes de hace aproximadamente un año.

    – Pete Becker

    28 de noviembre de 2012 a las 14:45

  • La URL aquí es bastante divertida: “how-is-int-main-valid-c”

    – tckmn

    06/04/2014 a las 22:29

avatar de usuario
Xeo

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

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

Luego, en C y C++, puede envolver expresiones entre 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 ([](){}).

Después, () después de que los primeros paréntesis envolventes llamen a la lambda (vacía). ahora estamos en ([](){})()

Toda la expresión está envuelta entre paréntesis nuevamente y obtenemos (([](){})()).

Al final, ; termina la declaración. llegamos a (([](){})());.


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

  • @R.MartinhoFernandes: Todavía estaba atascado en alguien, así que tuve que ir a buscarlo.

    – Xeo

    28 de noviembre de 2012 a las 10:54

  • iba a votar por correctamente mencionando el caso donde agregar () alrededor de una expresión altera la semántica. Pero luego recordé que eso no tiene relación con la pregunta, de verdad. Buena respuesta

    – seje

    28 de noviembre de 2012 a las 10:56

  • Los paréntesis también están cambiando el significado de un programa en el caso de la desambiguación de análisis más desconcertante: B foo(A()) foo es una función (tomando un puntero para funcionar como único parámetro y devolviendo una B) mientras que en B foo((A())) foo es un objeto B construido invocando un constructor que toma un objeto A (cuya instancia es un temporal anónimo en este caso).

    – Anuncio N

    23 de agosto de 2013 a las 11:05


  • @AdN: Eso ya no es una expresión, sino una declaración.

    – Xeo

    23 de agosto de 2013 a las 12:02


  • @R.MartinhoFernandes Creo que Ramón pensó que te referías a la daga lambda, que apuñala el tipo de retorno. (Por lo general, se llama “flecha”, pero pude ver llamando -> una daga”)

    – Yakk – Adam Nevraumont

    28 de marzo de 2016 a las 14:36


¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad