我最近遇到了下面这段深奥的代码。
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))之间有区别。