Как "int main() {(([]() {})());}" действительный С++?

Недавно я наткнулся на следующую эзотерическую часть кода.

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

Переформатируйте его следующим образом, чтобы сделать его более читаемым:

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

Но я не могу понять, как (([](){})()) является допустимым кодом.

  • Он не похож на синтаксис указателя функции.
  • Это не может быть какой-то перегрузкой оператора. Код компилируется как есть.

Google не очень помог с этим поиском всех символов. Но он компилируется в Visual Studio 2010 и ничего не выводит. Не было никаких ошибок и никаких предупреждений. Таким образом, он выглядит как действительный код.

Я никогда не видел никакого действительного кода, столь странного вне Javascript и указателей функций C.

Может кто-нибудь объяснить, насколько это действительно С++?

Ответ 1

Код по существу вызывает пустую лямбда.

Пусть начнется с начала: [](){} - это пустое выражение лямбда.

Затем в C и С++ вы можете обертывать выражения в parens и они ведут себя точно так же как если бы они были написаны без них, так что первая пара парен вокруг лямбда. Теперь мы находимся в ([](){}).

Затем () после того, как первые обертывающие пары вызовут (пустую) лямбду. Теперь мы находимся в ([](){})()

Все выражение снова завернуто в parens, и мы получаем (([](){})()).

Наконец, ; завершает утверждение. Мы приходим к (([](){})());.


† Есть некоторые угловые случаи, по крайней мере, на С++, например, с T a_var; существует разница между decltype(a_var) и decltype((a_var)).