283

我最近遇到了以下深奥的代码。

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

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

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

但我无法理解(([](){})())有效代码如何。

  • 它看起来不像函数指针语法。
  • 这不可能是一些运算符重载技巧。代码按原样编译。

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

我从未见过任何在JavascriptC 函数指针之外如此奇怪的有效代码。

有人可以解释这是如何有效的 C++ 吗?

4

1 回答 1

292

该代码本质上调用了一个空的 lambda。

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

然后,在 C 和 C++ 中,您可以将表达式包装在括号中,它们的行为与没有它们的情况完全相同†</sup>,所以这就是 lambda 周围的第一对括号所做的。我们现在在([](){})

然后,()在第一个包装括号之后调用(空)lambda。我们现在在([](){})()

整个表达式再次被包裹在括号中,我们得到(([](){})()).

最后,;结束声明。我们到达(([](){})());


†至少在 C++ 中存在一些极端情况,例如andT a_var; 之间存在差异decltype(a_var)decltype((a_var))

于 2012-11-28T10:51:48.103 回答