下面的代码编译的很好:
struct B {
B(int) {}
};
struct D : B {
D() = default;
};
直到我必须创建类 D
的实例:
D d; // error: use of deleted function 'D::D()'
是否有任何理由(用例)允许 D
的构造函数使用 = default
,而实际上它的工作原理是 = 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
默认构造函数已被删除,但我可以认为有两个原因:
- 此行为定义明确,没有理由禁止它。无论如何,仅当您尝试非法构造某些东西时才检测到错误。
- 它更灵活 - 将
B
更改为具有默认构造函数将自动允许D
拥有默认构造函数。
关于c++ - 在 =delete 的含义中使用 =default,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47991276/