已删除的默认构造函数在模糊错误中被标识为候选者

时间:2014-09-16 14:20:01

标签: c++ c++11

当试图删除默认构造函数并提供一个带默认参数的新构造函数时(因此仍然能够默认构造对象),我从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;”来修改上面的示例。然后它编译好。我知道编译器不会生成默认构造函数,因为我提供了自己的构造函数,因此该行是不必要的,但我对编译错误感到惊讶。

提前致谢!

1 个答案:

答案 0 :(得分:4)

在重载解析期间会考虑所有已声明的重载,即使它们已被删除或无法访问。因此,您已经声明了两个默认构造函数,这两个构造函数同样适用于默认初始化,因此存在歧义。

在这种情况下,根本不要声明零参数默认构造函数。单参数构造函数可用作默认构造函数,并且声明任何构造函数都会禁止生成隐式默认构造函数。