"int main(){(([[(){})());}"有效的C++是怎样的?

Mys*_*ial 264 c++ syntax lambda c++11

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

int main(){(([](){})());}
Run Code Online (Sandbox Code Playgroud)

按如下方式重新格式化以使其更具可读性:

int main(){
    (([](){})());   //  Um... what?!?!
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

Xeo*_*Xeo 275

代码本质上调用一个空的lambda.

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

然后,在C和C++中,你可以将表达式包装在parens中,它们的行为完全相同就好像没有它们一样,所以这就是lambda周围的第一对parens所做的事情.我们现在在([](){}).

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

整个表达再次包裹在parens中,我们得到了(([](){})()).

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


†有一些角落情况下,至少在C++中,就像T a_var; 有之间的差异decltype(a_var)decltype((a_var)).

  • @ R.MartinhoFernandes:它仍然被困在某人身上,所以我不得不去找它. (30认同)
  • 错过了一把匕首. (7认同)
  • 在最令人烦恼的parse歧义消除的情况下,括号也改变了程序的含义:`B foo(A())`foo是一个函数(将指向函数的指针作为唯一参数并返回B),而在` B foo((A()))`foo是一个B对象,它构造一个B对象,并调用带有A对象的构造函数(在这种情况下,该实例是一个匿名临时实例)。 (2认同)