如何“int main(){(([[](){})());}”有效的C ++?
我最近遇到了下面这段深奥的代码。
int main(){(([](){})());}
重新格式化如下,使其更具可读性:
int main(){
(([](){})()); // Um... what?!?!
}
但是我无法理解(([](){})())
是如何有效的代码。
Google对这种全符号搜索没有多大帮助。 但它在Visual Studio 2010中编译并不输出任何内容。 没有错误,也没有警告。 所以它看起来像有效的代码。
我从来没有见过任何在Javascript和C函数指针之外如此奇怪的有效代码。
有人可以解释这是如何有效的C ++?
代码基本上调用一个空的lambda。
让我们从头开始: [](){}
是一个空的lambda表达式。
然后,在C和C ++中,可以将表达式包装到parens中,并且它们的行为与没有它们时的行为完全相同,这就是lambda周围的第一对parens所做的。 我们现在在([](){})
。
然后, ()
在第一个包装零件调用(空)lambda之后。 我们现在在([](){})()
整个表达式再次包装在parens中,我们得到(([](){})())
。
最后, ;
结束声明。 我们到达(([](){})());
。
†至少在C ++中有一些角落案例,例如T a_var;
decltype(a_var)
和decltype((a_var))
之间有区别。