没有参数的构造函数没有括号是语言标准吗?

我正在使用g ++编译一个Cygwin中的C ++程序,而且我有一个构造函数没有参数的类。 我有线:

MyClass myObj(); myObj.function1(); 

而当试图编译它,我得到的消息:

错误:请求“myObj”中的成员'function1',它是非types的'MyClass()()'

经过一番研究,我发现修正是把第一行改成myClass myObj;

我可以发誓我已经用C ++中的圆括号做了空的构造函数声明。 这可能是我正在使用的编译器的限制还是语言标准真的说不使用不带参数的构造函数括号?

尽pipeMyClass myObj(); 可以用一个空的初始化程序或一个函数声明作为一个对象定义进行分析,语言标准指定了歧义总是以函数声明的forms被parsing。 在其他上下文中允许使用空括号初始值设定项,例如在newexpression式中或构build一个值初始化的临时

这被称为最令人头痛的parsing问题。 当parsing器看到

 MyClass myObj(); 

它认为你正在声明一个名为myObj的函数,它没有参数并返回一个MyClass

为了解决它,使用:

 MyClass myObj; 

我在C ++标准(§8.5.8)中find了这个:

对象的初始化方法是一组空括号,即(),应进行值初始化。

[注意:由于初始化器的语法不允许使用()

 X a (); 

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

这是一个相当知名的问题,不依赖于编译器。 基本上,你在做什么是声明一个函数返回MyObjtypes。 毫不奇怪,你不能调用它的构造函数。 看到C ++常见问题解答一个很好的解释

又一个最令人头痛的parsing命中。 请参阅示例sortingfunction不适用于堆栈上创build的函数对象?

 MyClass myObj(); 

这被parsing为函数声明,该函数被称为myObj,不接受任何参数并返回MyClass对象。 我从来没有见过编译器接受这一点。 另一方面, MyClass* myPtr = new MyClass(); 是可以接受的,可能是你弄糊涂了吗?

你的代码让编译器认为你正在声明一个名为myObj的函数,它不接受任何参数并返回一个MyClass 。 这个模棱两可的决议确实令人讨厌。

该标准不需要括号。

 int* x = new int; 

是合法的语法。

在你的情况myclass myobj(); 是一个函数原型。 而myclass myobj; 是一个variables。