使用=默认的意思=删除

下面的代码以及编译:使用=默认的意思=删除

struct B { 

B(int) {}

};

struct D : B {

D() = default;

};

直到我要创建D类的一个实例:

D d; // error: use of deleted function 'D::D()' 

是否有任何理由(用例)允许= defaultD的构造函数,当它的实际工作为= delete;

回答:

g++给出了错误一个很好的解释:

bla.cpp:6:5: note: ‘D::D()’ is implicitly deleted because the default definition would be ill-formed: D() = default;

默认构造函数将试图建构的D各地。您没有字段,但它有一个初始B - 它没有空构造函数,只有一个int

默认行为有意义 - D不应该有一个空的构造函数,除非它明确指出使用哪个int构造B,并且编译器不想猜测。否则,您将有一个D对象,并且根据在B构造函数B中发生的情况,可能包含垃圾,例如初始化字段。

我不知道,如果你的意思是你的问题从字面上,当你问这是为什么“允许”,作为B默认构造函数被删除,但我能想到的原因有两个:

  1. 这行为是明确的,并且没有理由拒绝它。无论如何,只有在您尝试非法构建某件事情时才能检测到错误。
  2. 它更灵活 - 将B更改为具有默认构造函数将自动允许D有一个。

回答:

Is there any reason (use case) to allow = default for D's constructor, when it's actually works as = delete;?

它不能作为=delete工作。它说了它应该说的内容。您明确希望编译器生成默认实现。

只是碰巧编译器生成了一个必须被定义删除。因为B的默认构造函数被隐式删除。

回答:

B有一个非默认构造函数(它的构造函数接受一个没有默认值的参数)。

派生D类,因此没有默认的构造函数,它的默认构造函数被删除(如编译器不能生成D一个构造函数可以调用B(int)构造它的父类的。)

D() = default;只是说您需要D的默认构造函数,并且如上所述,将删除默认的构造函数。

以上是 使用=默认的意思=删除 的全部内容, 来源链接: utcz.com/qa/264570.html

回到顶部