删除析构函数的意义是什么?

4

我发现规则(章节 N3797 :: 12.8 / 11 [class.copy]

默认情况下声明的复制/移动构造函数是其类的内联公共成员。如果类X有以下情况,则默认情况下类X的复制/移动构造函数被定义为删除(8.4.3):

[...]

—直接或虚基类或非静态数据成员是具有已删除或从默认构造函数无法访问的析构函数类型的情况,或

[...]

但是我根本没有理解在虚拟或直接基类中出现的已删除析构函数的含义。请考虑以下简单示例:

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() {
}

演示

你能澄清那件事吗?


@RaphaelM。是的,具有静态存储期的变量将在从主函数返回后被销毁。这很清楚。那么这样的析构函数有什么意义呢? - user2953119
@Nawaz,但是在我的第二个示例中,我从未分配一个变量。 - user2953119
@DmitryFucintv 你不分配内存,那么在B中不派生A怎么样?最终你只会得到A,这不能用于静态分配,这可能被视为一种特性。此外,无法派生也可以被视为一种特性,但现在有了“final”。 - oblitum
@pepper_chico,你能否提供一个防止分配的参考文献? - user2953119
@DmitryFucintv http://bl.ocks.org/anonymous/raw/b35134df97e00a135449/ - oblitum
显示剩余6条评论
1个回答

1
那个项目的原因在缺陷报告1191:删除子对象析构函数和隐式定义的构造函数中有详细解释。

Consider the following example:

struct A {
   A();
   ~A() = delete;
};

struct B: A { };
B* b = new B;

Under the current rules, B() is not deleted, but is ill-formed because it calls the deleted ~A::A() if it exits via an exception after the completion of the construction of A. A deleted subobject destructor should be added to the list of reasons for implicit deletion in 12.1 [class.ctor] and 12.8 [class.copy].

建议的解决方案是,在下面的 12.1 [class.ctor] 段落5中添加与您上面提到的符号相同的措辞:

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


请问您是否自己使用了已删除的析构函数? - user2953119
啊,我明白了。感谢您提供的问题参考,非常有帮助。 - user2953119

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接