如何“int main(){(([[](){})());}”有效的C ++?

我最近遇到了下面这段深奥的代码。

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

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

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

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

  • 它看起来不像函数指针语法。
  • 它不能是一些操作符重载的伎俩。 代码按原样编译。
  • Google对这种全符号搜索没有多大帮助。 但它在Visual Studio 2010中编译并不输出任何内容。 没有错误,也没有警告。 所以它看起来像有效的代码。

    我从来没有见过任何在Javascript和C函数指针之外如此奇怪的有效代码。

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


    代码基本上调用一个空的lambda。

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

    然后,在C和C ++中,可以将表达式包装到parens中,并且它们的行为与没有它们时的行为完全相同,这就是lambda周围的第一对parens所做的。 我们现在在([](){})

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

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

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


    †至少在C ++中有一些角落案例,例如T a_var; decltype(a_var)decltype((a_var))之间有区别。

    链接地址: http://www.djcxy.com/p/48059.html

    上一篇: How is "int main(){(([](){})());}" valid C++?

    下一篇: What are JavaScript's builtin strings?