αλε*_*λυτ 8 c++ default-constructor c++11
以下代码编译得很好:
struct B { 
    B(int) {} 
};
struct D : B {
    D() = default;
};
直到我必须创建一个类的实例D:
D d; // error: use of deleted function 'D::D()'
没有任何理由(用例),以允许= default进行D的构造,当它的实际工作为= delete;?
kab*_*nus 12
g++ 在错误中给出了一个很好的解释:
bla.cpp:6:5:注意:'D :: D()'被隐式删除,因为默认定义不正确:D()= default;
默认构造函数将尝试构造的所有部分D.你没有字段,但它有一个初始B- 它没有空的构造函数,只有int一个.
默认行为是有意义的 - D不应该有一个空的构造函数,除非它明确说明int构造Bwith,并且编译器不想猜测.否则你将有一个D对象,并且取决于B构造函数中发生的事情B可能包含垃圾,例如,如果初始化字段.
当你问为什么这是" 允许的 "时,我不确定你是否真的意味着你的问题,因为B删除了默认构造函数,但我可以想到两个原因:
B为拥有默认构造函数将自动允许D有一个.是否有任何原因(用例)允许= D的构造函数的默认值,当它实际上工作为= delete;?
它不起作用=delete.它说它应该说什么.您明确希望编译器生成默认实现.
恰好,编译器生成的一个必须被定义删除.因为B隐式删除了默认构造函数.