当试图删除默认构造函数并提供一个带默认参数的新构造函数时(因此仍然能够默认构造对象),我从g ++收到歧义错误。
class Thing
{
public:
Thing() = delete;
Thing(int arg = 0) : arg(arg) {}
private:
int arg;
};
int main(int, char**)
{
Thing thing;
return 0;
}
下面的编译错误:
$ g++ deletedConstructorTest.C -std=c++11
deletedConstructorTest.C: In function "int main(int, char**)":
deletedConstructorTest.C:12:9: error: call of overloaded "Thing()" is ambiguous
Thing thing;
^
deletedConstructorTest.C:12:9: note: candidates are:
deletedConstructorTest.C:5:5: note: Thing::Thing(int)
Thing(int arg = 0) :arg(arg) {}
^
deletedConstructorTest.C:4:5: note: Thing::Thing() <deleted>
Thing() = delete;
^
如果我通过删除“Thing()= delete;”来修改上面的示例。然后它编译好。我知道编译器不会生成默认构造函数,因为我提供了自己的构造函数,因此该行是不必要的,但我对编译错误感到惊讶。
提前致谢!
答案 0 :(得分:4)
在重载解析期间会考虑所有已声明的重载,即使它们已被删除或无法访问。因此,您已经声明了两个默认构造函数,这两个构造函数同样适用于默认初始化,因此存在歧义。
在这种情况下,根本不要声明零参数默认构造函数。单参数构造函数可用作默认构造函数,并且声明任何构造函数都会禁止生成隐式默认构造函数。