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?!?!
}
但是我无法理解([](){})()
是如何有效的代码
- 它看起来不像函数指针语法
- 这不可能是某种运算符重载技巧。代码按原样编译
有人能解释这是如何有效的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,它刺穿了返回类型。(它通常被称为“箭头”,但我可以看到调用->
一个“匕首”)