关于c ++ 11:“int main(){(([](){})());}”有效的C ++是什么?

How is “int main(){(([](){})());}” valid C++?

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

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

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

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

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

  • 它看起来不像函数指针语法。
  • 它不能是一些运算符重载技巧。代码按原样编译。

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

除了JavaScript和C函数指针之外,我从来没有见过这么奇怪的有效代码。

有人能解释一下C++的有效性吗?


代码基本上调用空lambda。

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

然后,在C和C++中,可以将表达式包在括号中,它们的行为完全相同吗?就好像没有它们,所以这就是lambda周围的第一对parens所做的。我们现在在江户十一〔一〕号。

然后,在第一个包装parens之后,()调用(空)lambda。我们现在在江户十一〔三〕号

整个表达式又用parens包起来,得到(([](){})())

最后,;结束了声明。我们到了江户十一〔六〕号。

?在C++中至少有一些角的情况,比如EDCOX1,7,EDCOX1,8,EDCX1,9之间的区别。