How is “int main(){(([](){})());}” valid C++?
我最近遇到了下面这段深奥的代码。
1
| int main(){(([](){})());} |
按如下方式重新格式化,使其更具可读性:
1 2 3
| int main(){
(([](){})()); // Um... what?!?!
} |
但我无法理解(([](){})())是如何有效的代码。
- 它看起来不像函数指针语法。
- 它不能是一些运算符重载技巧。代码按原样编译。
谷歌在全符号搜索方面没有太大帮助。但它在Visual Studio 2010中编译,不输出任何内容。没有错误,也没有警告。所以它看起来像有效的代码。
除了JavaScript和C函数指针之外,我从来没有见过这么奇怪的有效代码。
有人能解释一下C++的有效性吗?
- 嘿!那是我的。"Don't sweat it. We have int main(){(([](){})());} which is valid C++"(11月9日聊天)
- 这是一个C++ 11的lambda闭包
- 阅读关于C++ LAMBDAS,这就是EDOCX1×1是什么(一个空lambda函数)。
- 6年的C++,我从来没学过lambdas…我想这是我接下来要做的事情。
- 还有:"@Mysticial int main()??<((??(??)()???>)());??>"——更令人信服。
- @神秘的-这个代码让你迷惑,因为它是无用的。如果这个lambda可以做些什么,您将认识到它的语法类似于函数指针(它与函数指针密切相关)。
- @我没有收到消息是我的错。房间里的其他人赞成发表这个琐碎的问题。所以我错过了你的不同意见。不管我们是否应该删除这个,我都会打电话给你。
- @ Mysticial——"C++ 6年"——LAMBDAS只是在C++ 11中添加的,所以在一年或一年以前没有人有过这样的经验。
- 这里的网址很有趣:"how-is-int-main-valid-c"
- 这个公式正确吗?
- 仅供参考,这将在gcc上编译(使用g++命令)。与g++ -std=c++11 file.c一起
- int main();返回!<:]()<%;[=:>()<:&;]();%>();%>();仍然有效。我甚至不记得我在哪里找到它(在某地)。
- 我曾经认为javascript是生产中广泛使用的唯一一种深奥的编程语言…
- 它也是有效的:int ((main)()){(([](){})());},但我并不吹嘘它。
代码基本上调用空lambda。
让我们从头开始:[](){}是一个空lambda表达式。
然后,在C和C++中,可以将表达式包在括号中,它们的行为完全相同吗?就好像没有它们,所以这就是lambda周围的第一对parens所做的。我们现在在江户十一〔一〕号。
然后,在第一个包装parens之后,()调用(空)lambda。我们现在在江户十一〔三〕号
整个表达式又用parens包起来,得到(([](){})())。
最后,;结束了声明。我们到了江户十一〔六〕号。
?在C++中至少有一些角的情况,比如EDCOX1,7,EDCOX1,8,EDCX1,9之间的区别。
- 错过了一匕首。
- "r.martinhofernandes:它是安静的灰泥的人,所以我不得不去获取它。
- 我要提的正确upvote案例(WHERE)在年龄增加表达的语义。但我记得是没有关系的问题,真的。好的答案
- 因此,改变周围的括号的意思是A计划的案例解析:最vexing disambiguation B foo(A())foo是一个函数(以指向函数作为参数和返回只读a b)而在B foo((A()))foo是一个对象调用构造函数以M B A A A对象(这是一个匿名的临时实例在本案例)。
- @:这是不是和表达了,但一对。
- "你的意思是我的智囊团,思想r.martinhofernandes拉蒙的lambda匕首刺,它返回的类型。(这是通常被称为"箭",但我可以->湖"匕首"(电话)