c++ - 在 =delete 的含义中使用 =default

标签 c++ c++11 default-constructor

下面的代码编译的很好:

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 默认构造函数已被删除,但我可以认为有两个原因:

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

关于c++ - 在 =delete 的含义中使用 =default,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47991276/

相关文章:

c++ - 没有可行的重载 '=' 用于将 std::function 回调分配为成员函数

c++ - 如何在类中初始化 C++11 native 指针和数组?

c++ - 指向 lambda 的智能指针

c++ - 在 C++ 中使用默认构造函数初始化对象的不同方法

c++ - float 数组对齐错误

c++ - SDL2 在 Fedora 21 中调整 buggy 但在 Windows 中正常

c++ - 模板 vector <typename>迭代器的NULL/默认值

c++ - 信号量与互斥量

c# - 为什么在创建带参数的构造函数时默认的无参数构造函数消失

c++ - 虚拟继承中最基类是否需要默认ctor?