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

mri*_*ing 49 c++ standards constructor

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

MyClass myObj();
myObj.function1();
Run Code Online (Sandbox Code Playgroud)

当我尝试编译它时,我收到了消息:

error: request for member 'function1' in 'myObj', which is of non-class type 'MyClass ()()'
Run Code Online (Sandbox Code Playgroud)

经过一番研究,我发现修复是将第一行更改为

MyClass myObj;
Run Code Online (Sandbox Code Playgroud)

我可以发誓我之前用C++中的括号做了空构造函数声明.这可能是我正在使用的编译器的限制,还是语言标准真的说不使用括号用于没有参数的构造函数?

CB *_*ley 54

尽管MyClass myObj();可以使用空初始化程序或函数声明将其解析为对象定义,但语言标准指定始终解决歧义以支持函数声明.在其他上下文中允许空括号初始值设定项,例如在new表达式中或构造值初始化的临时.


Pet*_*der 52

这被称为最令人烦恼的解析问题.解析器看到的时候

MyClass myObj();
Run Code Online (Sandbox Code Playgroud)

它认为你声明一个myObj没有参数的函数并返回一个MyClass.

要绕过它,请使用:

MyClass myObj;
Run Code Online (Sandbox Code Playgroud)

  • 关于“最令人烦恼的解析”:也有一个维基百科页面https://en.wikipedia.org/wiki/Most_vexing_parse (2认同)

sus*_*att 19

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

初始值为空集括号的对象,即(),应进行值初始化.

[注意:初始化程序的语法不允许使用(),

X a ();
Run Code Online (Sandbox Code Playgroud)

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


Liz*_*bin 10

这是一个众所周知的问题,并不依赖于编译器.基本上,你正在做的是声明一个函数返回类型MyObj.毫不奇怪,你无法调用它的构造函数.有关一个很好的解释,请参阅C++ faq lite