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

时间:2015-10-21 08:38:19

标签: c++ c++11 destructor language-lawyer

根据these指南:

  

如果需要默认的析构函数,但它的生成已经存在   抑制(例如,通过定义移动构造函数),使用=default

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

有人可以告诉我示例确认上面的引用吗?

struct S {
    S() {};
    S( S&& ) {}; // move ctor
};

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

1 个答案:

答案 0 :(得分:7)

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

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

  

4如果一个类没有用户声明的析构函数,那么析构函数就是   隐含地宣布为违约(8.4)。一个隐含声明的   析构函数是其类的内联公共成员。

     

5如果出现以下情况,则将类X的默认析构函数定义为已删除:

     

(5.1) - X是类似联合的类,其变体成员带有   非平凡的析构函数,

     

(5.2) - 任何可能构造的子对象都有类型M(或   它的数组)和M有一个删除的析构函数或析构函数   从默认的析构函数中无法访问,

     

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