如何“int main(){(([()(){})());}”有效的C + +?
我最近遇到了以下深奥的一段代码。
int main(){(([](){})());}
重新格式化如下,使其更具可读性:
int main(){ (([](){})()); // Um... what?!?! }
但是我不明白怎么(([](){})())
是有效的代码。
- 它看起来不像函数指针语法。
- 它不能是一些运营商重载的伎俩。 代码按原样编译。
Google对这个全符号search没有什么帮助。 但它在Visual Studio 2010中编译并不输出。 没有错误,也没有警告。 所以它看起来像有效的代码。
我从来没有见过任何有效的代码,这是离奇的Javascript和C函数指针之外 。
有人可以解释这是如何有效的C ++?
代码本质上是调用一个空的lambda。
让我们从头开始: [](){}
是一个空的lambdaexpression式 。
然后,在C和C ++中,可以将expression式包装到parens中,并且它们的行为与没有它们时的行为完全相同,这就是lambda周围的第一对parens所做的。 我们现在在([](){})
。
然后, ()
在第一个包装零件调用(空)lambda之后。 我们现在在([](){})()
整个expression式再次包装在parens中,我们得到(([](){})())
。
最后, 结束声明。 我们到达(([](){})());
。
至less在C ++中有一些angular落案例,就像T a_var;
decltype(a_var)
和decltype((a_var))
之间有区别 。
- int a = {1,2,}; 允许使用奇怪的逗号。 任何特定的原因?
- 什么是这个C + +的语法,把一个括号包围的块放在一个expression式的位置?
- validationVIM中的PHP语法
- $(document).on('click','#id',function(){})vs $('#id')。on('click',function(){})
- 即时函数调用语法
- Oracle:'= ANY()'与'IN()'
- (OrElse和Or)和(AndAlso and And) – 何时使用?
- C#语法 – 通过逗号将string拆分为数组,转换为通用列表和逆序
- JavaScript和Python中的分号有什么区别?