使用 =default 表示 =删除
Using =default in meaning of =delete
下面的代码编译得很好:
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() = 默认值;
默认构造函数将尝试构造D
的所有部分。您没有字段,但它有一个初始B
- 它没有空的构造函数,只有一个int
构造函数。
默认行为是有意义的 -D
不应该有一个空的构造函数,除非它明确声明使用哪个int
构造B
,并且编译器不想猜测。否则,您将拥有一个D
对象,并且根据B
构造函数中发生的情况,B
可能包含垃圾,例如初始化字段时。
我不确定当你问为什么这是">允许的"时,你是否从字面上理解你的问题,因为B
默认构造函数被删除了,但我能想到两个原因:
- 此行为已明确定义,没有理由禁止它。无论如何,仅当您尝试非法构建某些东西时才检测错误。
- 它更灵活 - 将
B
更改为具有默认构造函数将自动允许D
拥有一个构造函数。
是否有任何理由(用例)允许 = 默认值用于 D 的构造函数,当它实际上工作为 = 删除时;
它不像=delete
那样工作.它说的正是它应该说的话。您明确希望编译器生成默认实现。
碰巧的是,编译器生成的编译器必须定义删除。因为B
的默认构造函数被隐式删除。
B
有一个非默认构造函数(其构造函数采用没有默认值的参数)。
因此,派生的D
类没有默认构造函数,其默认构造函数将被删除(因为编译器无法为可以调用其父类的B(int)
构造函数的构造函数生成D
。
D() = default;
只是说你想要D
的默认构造函数,如上所述,默认构造函数被删除。
相关文章:
- 将数组的地址分配给变量并删除
- 表示"accepting anything for this template argument" C++概念的通配符
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- C/C++编译器通常会删除重复的库吗
- 从链接列表c++中删除一个项目
- C++如何通过用户输入删除列表元素
- 为什么在C++中使用私有复制构造函数与删除复制构造函数
- 是否需要删除包含对象的"pair"?
- 如何将ampl中的集合表示为c++中的向量
- 如何在自删除后将对象设置为nullptr
- 迭代时从向量和内存中删除对象
- 使用函数"remove"删除重复元素
- 如何从多映射中删除特定的重复项
- 运算符C++ "delete []"仅删除 2 个前值
- 删除指向指针的指针是运行时错误吗
- std::is_base_of表示ctor编译错误
- 将指针设置为"nullptr"并不能防止双重删除?
- 为什么示例代码访问IUnknown中已删除的内存
- 删除类复制构造函数时,不能使用使用等号表示法的类构造函数
- 使用 =default 表示 =删除