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)
sus*_*att 19
我在C++标准(§8.5.8)中找到了这个:
初始值为空集括号的对象,即(),应进行值初始化.
[注意:初始化程序的语法不允许使用(),
Run Code Online (Sandbox Code Playgroud)X a ();
不是类X的对象的声明,而是函数的声明,不带参数并返回X.在某些其他初始化上下文中允许使用form()(5.3.4,5.2.3,12.6.2). - 尾注]
Liz*_*bin 10
这是一个众所周知的问题,并不依赖于编译器.基本上,你正在做的是声明一个函数返回类型MyObj.毫不奇怪,你无法调用它的构造函数.有关一个很好的解释,请参阅C++ faq lite