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

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

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

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

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

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

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

除了Javascript和C函数指针之外,我从未见过任何如此奇怪的有效代码。

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


当前回答

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

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

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

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

整个表达式再次用parens包装,得到(([](){})())。

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


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

其他回答

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

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

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

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

整个表达式再次用parens包装,得到(([](){})())。

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


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