提问者:小点点

带有空括号的默认构造函数


在C++中,一组空的圆括号(括号)对调用默认构造函数无效,这有什么好的理由吗?

MyObject  object;  // ok - default ctor
MyObject  object(blah); // ok

MyObject  object();  // error

我似乎每次都自动键入“()”。 有什么理由不允许这样做吗?


共3个答案

匿名用户

最烦人的解析

这与众所周知的“C++最烦人的解析”有关。 基本上,任何可以被编译器解释为函数声明的东西都会被解释为函数声明。

同一问题的另一个实例:

std::ifstream ifs("file.txt");
std::vector<T> v(std::istream_iterator<T>(ifs), std::istream_iterator<T>());

v被解释为具有2个参数的函数声明。

解决方法是添加另一对括号:

std::vector<T> v((std::istream_iterator<T>(ifs)), std::istream_iterator<T>());

或者,如果您有C++11和列表初始化(也称为统一初始化)可用:

std::vector<T> v{std::istream_iterator<T>{ifs}, std::istream_iterator<T>{}};

这样,它就不可能被解释为函数声明。

匿名用户

因为它被视为函数的声明:

int MyFunction(); // clearly a function
MyObject object(); // also a function declaration

匿名用户

相同的语法用于函数声明-例如函数object,不接受参数并返回myobject