Недавно я наткнулся на следующий эзотерический фрагмент кода.
int main(){(([](){})());}
Переформатируйте его следующим образом, чтобы сделать его более читабельным:
int main(){
(([](){})()); // Um... what?!?!
}
Но я не могу понять, как (([](){})())
действует код.
- Это не похоже на синтаксис указателя функции.
- Это не может быть какой-то уловкой перегрузки оператора. Код компилируется как есть.
Google не сильно помог с этим поиском по всем символам. Но он компилируется в Visual Studio 2010 и ничего не выводит. Не было ни ошибок, ни предупреждений. Так что похоже на действительный код.
Я никогда не видел какого - либо действительного кода , который так странно за пределами Javascript и C указателей функций .
Может кто-нибудь объяснить, как это действует C ++?
Don't sweat it. We have int main(){(([](){})());} which is valid C++"
(9 ноября в чате)Ответы:
Код по сути вызывает пустую лямбду.
Начнем с самого начала:
[](){}
это пустое лямбда-выражение .Тогда, в C и C ++, вы можете обернуть выражения в круглых скобках , и они ведут себя точно так же , † как если бы написано без них, так это то, что первая пара скобок вокруг лямбды делает. Мы теперь в
([](){})
.Затем
()
после первой обертки Паренс вызывает (пустую) лямбду. Мы сейчас в([](){})()
Все выражение снова оборачивается в парен, и мы получаем
(([](){})())
.Наконец,
;
заканчивается утверждение. Мы приходим к(([](){})());
.† Есть несколько угловых случаев, по крайней мере, в C ++, например, с
T a_var;
разницей междуdecltype(a_var)
иdecltype((a_var))
.источник
B foo(A())
foo - это функция (принимает указатель на функцию в качестве единственного параметра и возвращает B), тогда как вB foo((A()))
foo создается объект B, вызывающий конструктор, принимающий Объект (который в данном случае является анонимным временным).