4

根据下面广为人知的表格,当复制赋值、复制构造函数和析构函数中的一个或多个由用户提供时(红色单元格表示弃用)。鉴于“3 规则”,这是完全合理的。但是,该表显示,在用户提供的复制构造函数/赋值的情况下,默认析构函数的生成不会被弃用。

这个设计决定背后的理由是什么?

参考表

4

1 回答 1

2

为什么要弃用它?一个对象完全有可能需要特殊的复制属性,但它的销毁完全由它的子对象析构函数决定。考虑一个简单的克隆指针:

template <class T>
class cloning_ptr
{
  std::unique_ptr<T> p;

public:
  cloning_ptr(const cloning_ptr &src) : p(std::make_unique<T>(*src.p) {}
  cloning_ptr(cloning_ptr &&) = default;

  cloning_ptr& operator= (cloning_ptr rhs)
  { swap(p, rhs.p); return *this; }    
};

提供一个与默认析构函数不同的析构函数是零理由的。

另一种方式是不同的:如果您需要在 dtor 中做一些特殊的事情,这可能意味着在类中建模了一些非标准所有权。非标准所有权也很可能需要在复制操作中进行处理。

于 2017-06-08T09:06:35.653 回答