Recentemente, deparei com o seguinte código esotérico.
int main(){(([](){})());}
Reformate-o da seguinte forma para torná-lo mais legível:
int main(){
(([](){})()); // Um... what?!?!
}
Mas não consigo entender como (([](){})())
é um código válido.
- Não parece com a sintaxe do ponteiro de função.
- Não pode ser um truque de sobrecarga do operador. O código compila como está.
O Google não ajudou muito nessa pesquisa com todos os símbolos. Mas ele compila no Visual Studio 2010 e não produz nada. Não houve erros nem avisos. Portanto, parece um código válido.
Eu nunca vi qualquer código válido que está fora de forma bizarra de JavaScript e C ponteiros de função .
Alguém pode explicar como isso é válido em C ++?
Don't sweat it. We have int main(){(([](){})());} which is valid C++"
(9 de novembro no chat)Respostas:
O código essencialmente chama uma lambda vazia.
Vamos começar do começo:
[](){}
é uma expressão lambda vazia .Então, em C e C ++, você pode envolver expressões em parênteses e eles se comportam exatamente da mesma † como se fosse escrito sem eles, então é isso que o primeiro par de parênteses em torno da lambda faz. Estamos agora em
([](){})
.Então,
()
após o primeiro empacotamento, o parens chama o lambda (vazio). Estamos agora em([](){})()
Toda a expressão está envolta em parênteses novamente e entendemos
(([](){})())
.Por fim,
;
termina a declaração. Chegamos a(([](){})());
.† Existem alguns casos de canto pelo menos em C ++, como
T a_var;
há uma diferença entredecltype(a_var)
edecltype((a_var))
.fonte
B foo(A())
foo é uma função (pegar um ponteiro para funcionar como único parâmetro e retornar um B) enquanto emB foo((A()))
foo é um objeto B construído invocando um construtor a Um objeto (cuja instância é temporária anônima neste caso).