删除析构函数的意义何在



我遇到了规则(第 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以下部分添加你上面注意到的圆点和相同的措辞:

任何直接或虚拟基类或非静态数据成员都具有具有析构函数的类型,该析构函数已从默认的默认构造函数中删除或无法访问。

最新更新