Как "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))
.