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

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

MyObject  object();  // error

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


当前回答

从n4296 [dcl.init]:

[注意:由于初始化式语法不允许使用(), X ();不是类X对象的声明,而是 函数不带参数并返回x的声明 Form()在某些其他初始化上下文中被允许(5.3.4, 5.2.3 12.6.2)。 -结束注释]

c++ 11链接 c++ 14链接

其他回答

相同的语法用于函数声明——例如,函数对象,不接受参数并返回MyObject

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

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

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

我猜,编译器不会知道这个语句:

MyObject object();

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

正如我多次提到的,这是一种宣言。这是向后兼容的方式。这是c++中因其遗留问题而显得愚蠢/不一致/痛苦/虚伪的众多领域之一。