使用 =default 表示 =删除

Using =default in meaning of =delete

本文关键字:删除 表示 default 使用      更新时间:2023-10-16

下面的代码编译得很好:

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:注意:"D::D()"被隐式删除,因为默认定义格式不正确: D() = 默认值;

默认构造函数将尝试构造D的所有部分。您没有字段,但它有一个初始B- 它没有空的构造函数,只有一个int构造函数。

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

我不确定当你问为什么这是">允许的"时,你是否从字面上理解你的问题,因为B默认构造函数被删除了,但我能想到两个原因:

  1. 此行为已明确定义,没有理由禁止它。无论如何,仅当您尝试非法构建某些东西时才检测错误。
  2. 它更灵活 - 将B更改为具有默认构造函数将自动允许D拥有一个构造函数。

是否有任何理由(用例)允许 = 默认值用于 D 的构造函数,当它实际上工作为 = 删除时;

它不像=delete那样工作.它说的正是它应该说的话。您明确希望编译器生成默认实现。

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

B有一个非默认构造函数(其构造函数采用没有默认值的参数)。

因此,派生的D类没有默认构造函数,其默认构造函数将被删除(因为编译器无法为可以调用其父类的B(int)构造函数的构造函数生成D

D() = default;只是说你想要D的默认构造函数,如上所述,默认构造函数被删除。