根据下面广为人知的表格,当用户提供一个或多个复制赋值函数、复制构造函数和析构函数时,C++11 中不推荐自动编译器生成默认复制构造函数和复制赋值(红色单元格表示弃用)。考虑到“三法则”,这是完全有道理的。然而,该表显示,在用户提供的复制构造函数/赋值的情况下,默认析构函数的生成并未被弃用。
这个设计决定背后的理由是什么?
为什么应该弃用它?对象完全有可能需要特殊的复制属性,但其销毁完全由其子对象析构函数决定。考虑一个简单的克隆指针:
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 中执行特殊操作,这可能意味着类中存在一些非标准所有权建模。非标准所有权很可能也需要在复制操作中进行处理。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)