C++ “是怎么回事?”;int main(){(([](){})();}";有效的C++;?

C++ “是怎么回事?”;int main(){(([](){})();}";有效的C++;?,c++,c++11,lambda,syntax,C++,C++11,Lambda,Syntax,我最近遇到了以下一段深奥的代码 int main(){(([](){})());} 将其重新格式化如下,以使其更具可读性: int main(){ (([](){})()); // Um... what?!?! } 但是我无法理解([](){})()是如何有效的代码 它看起来不像函数指针语法 这不可能是某种运算符重载技巧。代码按原样编译 谷歌在这个全符号搜索方面帮不了多少忙。但它在VisualStudio2010中编译,没有输出任何内容。没有错误,也没有警告。所以它看起来像

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

int main(){(([](){})());}
将其重新格式化如下,以使其更具可读性:

int main(){
    (([](){})());   //  Um... what?!?!
}
但是我无法理解
([](){})()
是如何有效的代码

  • 它看起来不像函数指针语法
  • 这不可能是某种运算符重载技巧。代码按原样编译
谷歌在这个全符号搜索方面帮不了多少忙。但它在VisualStudio2010中编译,没有输出任何内容。没有错误,也没有警告。所以它看起来像是有效的代码

我从未见过任何有效的代码在和之外如此奇怪


有人能解释这是如何有效的C++?< /p> < p>代码本质上是一个空lambda。< /p> 让我们从头开始:

[](){}
是空的

那么,在C和C++中,你可以把表达式包在括号里,它们的行为完全相同,就像没有它们的书写一样,这就是lambda周围的第一对夫妇所做的事情。我们现在在

([](){})

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

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

最后,
结束语句。我们到达
([](){})()



>在C++中至少有一些拐角的情况,比如<<代码> t avar;<代码>

嘿!那是我的。(11月9日聊天)这是一个c++11 lambdaclosure@Mysticial-此代码使您感到困惑,因为它是无用的。如果这个lambda可以做些什么,你会发现它的语法与函数指针类似(它与函数指针密切相关)。@mystical-“6年的C++”-lambda是在C++11中添加的,所以在大约一年前没有人有过使用它们的经验。这里的URL非常有趣:“how-is-int-main-valid-C”@R.MartinhoFernandes:它仍然卡在某人身上,所以我不得不去取回它。我要投票支持正确地提到在表达式周围添加()会改变语义的情况。但后来我想起这与问题无关,真的。很好的回答在最麻烦的解析消歧情况下,括号也在改变程序的含义:
bfoo(a())
foo是一个函数(将指向函数的指针作为唯一参数并返回a B),而在
bfoo((a())
foo是一个调用构造函数的B对象(在本例中,哪个实例是一个匿名的临时实例)。@AdN:这不再是一个表达式,而是一个声明。@R.MartinhoFernandes我想Ramon认为你指的是lambda dagger,它刺穿了返回类型。(它通常被称为“箭头”,但我可以看到调用
->
一个“匕首”)