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

有没有什么好的理由,一个空的圆括号(圆括号)是无效的调用C ++中的默认构造函数?

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

我似乎每次都会自动input“()”。 有没有很好的理由,这是不允许的?

最令人烦恼的parsing

这与所谓的“C ++最令人头疼的parsing”有关。 基本上,任何可以被编译器解释为声明的东西都会被解释为声明。

同样问题的另一个例子:

 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

因为编译器认为它是一个不带参数的函数声明并返回一个MyObject实例。

你也可以使用更详细的构造方式:

 MyObject object1 = MyObject(); MyObject object2 = MyObject(object1); 

在C ++ 0x这也允许auto

 auto object1 = MyObject(); auto object2 = MyObject(object1); 

我想,编译器不会知道这个声明:

MyObject object();

是一个构造函数调用或函数原型,声明一个名为object的函数,返回types为MyObject ,不带参数。

多次提到,这是一个声明。 这是为了向后兼容。 C ++的许多领域之一,因为它的传统是愚蠢的/不一致的/痛苦的/假的。

从n4296 [dcl.init]:

[ 注意:
由于初始化器的语法不允许X a(); ,所以X a(); 不是X类对象的声明,而是一个不带参数并返回X的函数的声明。在某些其他初始化上下文(5.3.4,5.2.3,12.6.2)中允许使用form()。
– 注意]

正如其他人所说,这是一个函数声明。 既然C ++ 11可以使用大括号初始化,如果你需要看到空的东西明确告诉你,使用默认的构造函数。

 Jedi luke{}; //default constructor