在= delete的含义中使用= default

αλε*_*λυτ 8 c++ default-constructor c++11

以下代码编译得很好:

struct B { 
    B(int) {} 
};

struct D : B {
    D() = default;
};
Run Code Online (Sandbox Code Playgroud)

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

D d; // error: use of deleted function 'D::D()'
Run Code Online (Sandbox Code Playgroud)

没有任何理由(用例),以允许= 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删除了默认构造函数,但我可以想到两个原因:

  1. 这种行为定义明确,没有理由不允许它.无论如何,只有在您尝试非法构造某些东西时才会检测到错误.
  2. 它更灵活 - 更改B为拥有默认构造函数将自动允许D有一个.


Sto*_*ica 6

是否有任何原因(用例)允许= D的构造函数的默认值,当它实际上工作为= delete;?

它不起作用=delete.它说它应该说什么.您明确希望编译器生成默认实现.

恰好,编译器生成的一个必须被定义删除.因为B隐式删除了默认构造函数.

  • @alexolut - 无论哪种方式删除该功能.原因是不同的.如果将来`B`得到一个默认的c'tor,'D`也会.如果你坚持删除它,它不会.有人会说这是一个主要的语义差异. (2认同)