根据these指南:
如果需要默认的析构函数,但它的生成已经存在 抑制(例如,通过定义移动构造函数),使用
=default
。
我无法想象如果没有具有移动构造函数的类中的显式默认析构函数,代码将会形成错误。
有人可以告诉我示例确认上面的引用吗?
struct S {
S() {};
S( S&& ) {}; // move ctor
};
int main() {
S s; // there is no need to declare dtor explicitly =default
}
答案 0 :(得分:7)
我认为这将是某种错误,默认析构函数的隐式声明应该与移动构造函数的定义无关。
从标准,12.4 $ 4,5 Destructors [class.dtor]
4如果一个类没有用户声明的析构函数,那么析构函数就是 隐含地宣布为违约(8.4)。一个隐含声明的 析构函数是其类的内联公共成员。
5如果出现以下情况,则将类X的默认析构函数定义为已删除:
(5.1) - X是类似联合的类,其变体成员带有 非平凡的析构函数,
(5.2) - 任何可能构造的子对象都有类型M(或 它的数组)和M有一个删除的析构函数或析构函数 从默认的析构函数中无法访问,
(5.3) - 或者,对于虚拟析构函数,查找非数组 deallocation函数导致歧义或函数 从默认的析构函数中删除或无法访问。