"int main(){([](){})());}"有效的c++吗?

我最近遇到了下面这段深奥的代码。

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

重新格式化如下,使其更具可读性:

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

但我不明白(([](){})())是如何有效的代码。

  • 它看起来不像函数指针语法。
  • 这不可能是什么操作符重载的把戏。代码按原样编译。

谷歌对全符号搜索没有多大帮助。但是它在Visual Studio 2010中编译并且没有输出任何内容。没有错误,也没有警告。所以看起来是有效的代码。

我从未见过任何有效的代码是如此奇怪的JavascriptC函数指针之外。

有人能解释一下为什么这是有效的c++吗?

15761 次浏览

代码实际上调用了一个空lambda。

让我们从头开始:[](){}是空的lambda表达式

然后,在C和c++中,你可以用paren来包装表达式,它们的行为完全相同__abc1,就像写的时候没有它们一样,所以这就是lambda周围的第一对paren所做的事情。我们现在在([](){})

然后,()在第一个包装parens之后调用(空)lambda。我们现在在([](){})()

整个表达式被再次包装在parens中,我们得到(([](){})())

最后,;结束语句。我们到达(([](){})());


†至少在c++中有一些极端情况,如T a_var; __ABC1和decltype((a_var))之间有区别