“int main(){(([[(){})());}”有效的C ++是怎样的?

时间:2012-11-28 10:50:15

标签: c++ c++11 lambda syntax

我最近遇到了以下深奥的代码。

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

按如下方式重新格式化以使其更具可读性:

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

但我无法理解(([](){})())是有效代码的方式。

  • 它看起来不像函数指针语法。
  • 它可能不是某些运算符重载技巧。代码按原样编译。
谷歌对这种全符号搜索没有多大帮助。但它在Visual Studio 2010中编译并且不输出任何内容。没有错误,也没有警告。所以它看起来像是有效的代码。

我从未见过JavascriptC function pointers之外的任何有效代码。

有人可以解释这是如何有效的C ++?

1 个答案:

答案 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))