我最近遇到了以下深奥的代码 .
int main(){(([](){})());}
按如下方式重新格式化以使其更具可读性:
int main(){
(([](){})()); // Um... what?!?!
}
但我无法理解 (([](){})())
是如何有效的代码 .
-
它看起来不像函数指针语法 .
-
它不能是一些运算符重载技巧 . 代码按原样编译 .
谷歌对这种全符号搜索没有多大帮助 . 但它在Visual Studio 2010中编译并且不输出任何内容 . 没有错误,也没有警告 . 所以它看起来像有效的代码 .
我从未见过任何在Javascript和C function pointers之外如此奇怪的有效代码 .
有人可以解释一下这是有效的C吗?
1 回答
代码本质上调用一个空的lambda .
让我们从头开始:
[](){}
是一个空的lambda expression .然后,在C和C中,你可以将表达式包装在parens中,它们的行为完全相同†就像没有它们一样,所以's what the first pair of parens around the lambda does. We'现在在
([](){})
.然后,
()
在第一个包装parens之后调用(空)lambda . 我们现在在([](){})()
整个表达再次包含在parens中,我们得到
(([](){})())
.最后,
;
结束了该声明 . 我们到达(([](){})());
.†至少在C中存在一些极端情况,例如
T a_var;
there's a difference between decltype(a_var) and decltype((a_var)) .