删除析构函数的意义何在
What is the point of deleted destructor?
我遇到了规则(第 N3797::12.8/11 [class.copy]
节)
隐式声明的复制/移动构造函数是内联公共 其类的成员。类 X 的默认复制/移动构造函数 定义为已删除 (8.4.3),如果 X 具有:
[...]
— 任何直接或虚拟基类或类型的非静态数据成员 使用从默认值中删除或无法访问的析构函数 构造函数,或
[...]
但是我根本无法理解删除析构函数出现在虚拟或直接基类中的意义。考虑以下简单示例:
struct A
{
~A() = delete;
A(){ }
};
struct B : A
{
B(){ }; //error: use of deleted function 'A::~A()'
};
B b;
int main() { }
演示
我完全不清楚。我明确定义了 0 参数构造函数,它不使用基类析构函数。但编译器不这么认为。即使我们显式定义B
的析构函数,它也不会起作用:
struct A
{
~A() = delete;
A(){ }
};
struct B : A
{
B(){ };
~B(){ };
};
//B b;
int main() {
}
演示
你不能澄清一下吗?
缺陷报告 1191 中涵盖了该项目符号的基本原理:删除了子对象析构函数和隐式定义的构造函数,其中指出:
请考虑以下示例:
struct A { A(); ~A() = delete; }; struct B: A { }; B* b = new B;
根据现行规则,B() 不会被删除,但格式不正确,因为 如果它通过异常退出,则调用已删除的 ~A::A() A的建设完成。已删除的子对象析构函数 应添加到 12.1 中隐式删除的原因列表中 [class.ctor] 和 12.8 [class.copy]。
拟议的决议是在[class.ctor]第5段12.1
以下部分添加你上面注意到的圆点和相同的措辞:
任何直接或虚拟基类或非静态数据成员都具有具有析构函数的类型,该析构函数已从默认的默认构造函数中删除或无法访问。
相关文章:
- 如何在析构函数中删除C++中动态分配的数组?
- 当两者都调用时,删除和析构函数之间的区别?
- 在析构函数中删除单链表的正确方法是什么?
- C++类析构函数删除成员(如果"owner"?
- C++ 在析构函数调用之前删除的动态成员数组
- 为什么为未删除的对象调用析构函数?
- 使用私有析构函数删除动态分配的对象
- 析构函数删除错误的元素
- C++ 类析构函数删除部分但不是全部成员数据
- 析构函数删除在 main 中声明的动态数组
- C++析构函数删除东西(对象,指针?)太快
- C++析构函数删除包含动态数组作为数据成员的对象时的用法
- C++11 析构函数 = 删除
- 父类析构函数删除具有外部启动元素的子类
- C++析构函数删除共享内存
- 析构函数删除数组时出错
- 在链表中,析构函数删除节点的顺序
- 使用类析构函数删除动态数组
- 通过析构函数删除动态成员会导致程序挂起
- 使用析构函数删除动态对象?c++