A a之间的区别是什么?和A a();?

时间:2016-11-14 13:26:40

标签: c++ constructor initialization most-vexing-parse

以下类的声明之间有什么区别?

class A
{
public:
    A()
    {
        std::cout << "A()\n";
    }
    ~A()
    {
        std::cout << "~A()\n";
    }
};

int main(int argc, char *argv[])
{
    A a; // <-- this call the constructor and destructor
    A b(); // <-- this is not!! what is a b()?
    return 0;
}

什么是b()

1 个答案:

答案 0 :(得分:3)

这是一个most vexing parse问题; C ++规则的副作用,即任何可以解析为 声明必须解释为一个。所以A b();是一个函数声明,b是一个函数不带任何东西并返回A

从C ++ 11开始,您可以使用大括号(list initialization)代替括号;因为无法使用大括号为参数列表声明函数,所以&#34;歧义&#34;走了。

A b{}; // calls A's default constructor