以下代码编译得很好:
struct B {
B(int) {}
};
struct D : B {
D() = default;
};
直到我必须创建类D
的实例:
D d; // error: use of deleted function 'D::D()'
是否有任何理由(用例)允许= default
为D
的构造函数,当它实际上作为= delete;
工作?
g++
在错误中给出了一个很好的解释:
bla.cpp:6:5:注意:'D :: D()'被隐式删除,因为默认定义不正确:D()= default;
默认构造函数将尝试构造D
的所有部分。你没有字段,但它有一个初始的B
- 它没有空的构造函数,只有一个int
。
默认行为是有道理的 - D
不应该有一个空构造函数,除非它明确说明使用哪个int
来构造B
,并且编译器不想猜测。否则你将有一个D
对象,并且根据B
构造函数中发生的情况,B
可能包含垃圾,例如,如果初始化字段。
当你问为什么这是“允许的”时,我不确定你是否真的意味着你的问题,因为删除了B
默认构造函数,但我可以想到两个原因:
B
以使用默认构造函数将自动允许D
拥有一个。是否有任何原因(用例)允许= D的构造函数的默认值,当它实际上工作为= delete;?
它不像=delete
那样工作。它说它应该说什么。您明确希望编译器生成默认实现。
恰好,编译器生成的一个必须被定义删除。因为隐式删除了B
的默认构造函数。
B
有一个非默认的构造函数(它的构造函数接受一个没有默认值的参数)。
派生的D
类因此没有默认构造函数,它的默认构造函数被删除(因为编译器无法为D
生成可以调用其父类的B(int)
构造函数的构造函数。)
D() = default;
只是说你想要D
的默认构造函数,并且如上所述,默认构造函数被删除。