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

时间:2012-09-06 09:30:40

标签: 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)
    ...
}
  

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

void g()
{
    List x();   // Function named x (that returns a List)
    ...
}

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

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

1 个答案:

答案 0 :(得分:6)

  

如果它确实是一个声明,编译器就不会抱怨你不能在函数中声明一个函数。

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

这被称为最令人烦恼的解析,并且有很好的文档记录。实际上,代表编译器处理

会出错
List x();

作为变量声明。

  

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

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