我最近遇到了以下深奥的代码。
int main(){(([](){})());}
按如下方式重新格式化以使其更具可读性:
int main(){
(([](){})()); // Um... what?!?!
}
但我无法理解(([](){})())
是有效代码的方式。
我从未见过Javascript和C function pointers之外的任何有效代码。
有人可以解释这是如何有效的C ++?
答案 0 :(得分:271)
代码本质上调用一个空的lambda。
让我们从头开始:[](){}
是一个空的lambda expression。
然后,在C和C ++中,你可以将表达式包装在parens中,它们的表现与†完全相同,就像没有它们一样,这就是lambda周围的第一对parens所做的事情。我们现在在([](){})
。
然后,()
在第一个包装parens之后调用(空)lambda。我们现在在([](){})()
整个表达再次包含在parens中,我们得到(([](){})())
。
最后,;
结束了声明。我们到达(([](){})());
。
†至少在C ++中存在一些极端情况,例如T a_var;
there's a difference between decltype(a_var)
and decltype((a_var))
。