暗中使用析构函数

时间:2015-11-03 11:34:40

标签: c++ c++11

我有一个删除了析构函数的类(实际上,它需要外部帮助才能被销毁):

struct indestructible {
    indestructible(indestructible&&);
    ~indestructible() = delete;
};

当我尝试使用其移动构造函数时,编译器会抱怨:

struct user {
   indestructible ind;
   user(indestructible&& ind) : ind(std::move(ind)) {}
};

indestructible.cc:11:3: error: attempt to use a deleted function
user(indestructible&& ind) : ind(std::move(ind)) {}
^
indestructible.cc:6:3: note: '~indestructible' has been explicitly marked  deleted here
    ~indestructible() = delete;

发生了什么?没有其他成员可以抛出,构造函数体也没有,那么为什么移动构造函数调用析构函数有什么原因?

2 个答案:

答案 0 :(得分:7)

当您的user对象超出范围时,它将被破坏。它的成员被破坏,包括indestructible成员,并且因为它的析构函数被删除而不可能。

答案 1 :(得分:3)

[class.base.init]/12

  

在非委托构造函数中,每个direct或者析构函数   虚拟基类和类类型的每个非静态数据成员   可能被调用(12.4)。 [注意:此规定确保了这一点   如果是,则可以为完全构造的子对象调用析构函数   抛出异常(15.2)。 - 结束记录]

[class.dtor]/11

  

如果可能被调用的析构函数是,则程序格式错误   从调用的上下文中删除或无法访问。

对于不会抛出的构造函数没有异常。另请参阅CWG 1915