`List x;`和`List x()`之间有什么区别吗?

mab*_*aba 4 c++ variable-declaration most-vexing-parse

标题来自Marshall Cline 着名的网站C++ FAQ.

作者声称以下两个代码示例之间存在差异.

假设List是某个类的名称.然后函数f()声明一个名为x的本地List对象:

void f()
{
    List x;     // Local object named x (of class List)
    ...
}
Run Code Online (Sandbox Code Playgroud)

但是函数g()声明了一个名为x()的函数,它返回一个List:

void g()
{
    List x();   // Function named x (that returns a List)
    ...
}
Run Code Online (Sandbox Code Playgroud)

但使用第二种变体是否真的错了?

如果真的是一个声明,编译器会不会抱怨你不能在函数中声明一个函数?

Luc*_*ore 6

如果真的是一个声明,编译器就不会抱怨你不能在函数中声明一个函数.

当然不是.因为你可以声明一个带函数的函数.

这被称为最令人烦恼的解析,并且有很好的记录.实际上,代表编译器处理它将是一个错误

List x();
Run Code Online (Sandbox Code Playgroud)

作为变量声明.

但使用第二种变体是否真的错了?

如果你想要一个变量,那么是的.如果你想声明一个函数......有点是.你可以,但通常你会在功能范围之外做.

  • 这不是真正最令人烦恼的解析(只有"半数"),最令人烦恼的解析是`List x(List());`. (5认同)
  • @Kenny:那是第二个最令人烦恼的解析.或者是第三个最令人烦恼的解析,而你的第二个解析,你的第二个,因为`vector <string> v(istream_reader <string>(cin),istream_reader <string>());`是*真的*吓到了烦恼;-) (2认同)