我遇到了规则(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-argument构造函数explcitly并且它没有使用基类析构函数。但编译器认为不然。即使我们明确定义B
的析构函数,它也不会起作用:
struct A
{
~A() = delete;
A(){ }
};
struct B : A
{
B(){ };
~B(){ };
};
//B b;
int main() {
}
你不明白那件事吗?
答案 0 :(得分:1)
该子弹的基本原理在defect report 1191: Deleted subobject destructors and implicitly-defined constructors中有所说明:
考虑以下示例:
struct A { A(); ~A() = delete; }; struct B: A { }; B* b = new B;
根据现行规则,B()不会被删除,但因为格式不正确 它调用删除的~A :: A()如果它在之后通过异常退出 完成构建A.删除子对象析构函数 应添加到12.1中隐式删除的原因列表中 [class.ctor]和12.8 [class.copy]。
并且建议的决议是将上面提到的子弹和相同的措辞添加到下一节12.1
[class.ctor]第5段:
任何直接或虚拟基类或非静态数据成员都有一个带有析构函数的类型,该类型在默认的默认构造函数中被删除或无法访问。