A a; 和有什么区别?和一个 a();?

What's the difference between A a; and A a();?

下面类的声明有什么区别?

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()

这是一个 most vexing parse 问题; C++ 规则的副作用是任何可以被解析为 声明必须被解释为一个。所以 A b(); 是一个函数声明,b 是一个什么都不做的函数,returns A.

从 C++11 开始,您可以使用大括号 (list initialization) 代替圆括号;因为不能使用参数列表的大括号声明函数,所以 "ambiguity" 消失了。

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