我有一个删除了析构函数的类(实际上,它需要外部帮助才能被销毁):
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;
发生了什么?没有其他成员可以抛出,构造函数体也没有,那么为什么移动构造函数调用析构函数有什么原因?
答案 0 :(得分:7)
当您的user
对象超出范围时,它将被破坏。它的成员被破坏,包括indestructible
成员,并且因为它的析构函数被删除而不可能。
答案 1 :(得分:3)
在非委托构造函数中,每个direct或者析构函数 虚拟基类和类类型的每个非静态数据成员 可能被调用(12.4)。 [注意:此规定确保了这一点 如果是,则可以为完全构造的子对象调用析构函数 抛出异常(15.2)。 - 结束记录]
如果可能被调用的析构函数是,则程序格式错误 从调用的上下文中删除或无法访问。
对于不会抛出的构造函数没有异常。另请参阅CWG 1915。