需要声明析构函数为默认值

Need for declare destructor as default

本文关键字:默认值 析构函数 声明      更新时间:2023-10-16

根据这些准则:

如果需要默认析构函数,但它的生成已经完成(例如,通过定义move构造函数),使用=default .

我无法想象如果在有移动构造函数的类中没有显式的默认析构函数,代码会是错误的。

谁能给我举个例子来证实上面的报价?

struct S {
    S() {};
    S( S&& ) {}; // move ctor
};
int main() {
    S s; // there is no need to declare dtor explicitly =default
}

我认为这将是某种错误,默认析构函数的隐式声明应该与move构造函数的定义无关。

来自标准,12.4$4,5 Destructors [class.dtor]

如果一个类没有用户声明的析构函数,则有一个析构函数隐式声明为默认值(8.4)。一个隐式声明的析构函数是其类的内联公共成员。类X的默认析构函数定义为已删除,如果:

(5.1) - X是一个类并(union-like)类,它有一个带有a的变体成员非平凡析构函数,

(5.2) -任何潜在构造的子对象具有类类型M(或数组),并且M有一个已删除的析构函数或一个从默认析构函数

中不可访问

(5.3) -或者,对于虚析构函数,查找非数组解分配函数会导致歧义,或者导致函数是从默认析构函数中删除或无法访问。