C++11 中的 3 默认成员弃用规则
Rule of 3 Default Member Deprecation in C++11
根据下面广为人知的 table,当复制赋值、复制构造函数和析构函数中的一个或多个时,C++11 中不推荐自动编译器生成默认复制构造函数和复制赋值 is/are 由用户提供(红色单元格表示弃用)。鉴于 "Rule of 3",这是完全合理的。但是,table 表明在用户提供的副本 constructor/assignment.
的情况下,默认析构函数的生成并未被弃用
这个设计决定背后的基本原理是什么?
为什么要弃用它?一个对象完全有可能需要特殊的复制属性,但它的销毁完全由它的子对象析构函数决定。考虑一个简单的克隆指针:
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 中做特殊的事情,那可能意味着 class 中存在一些非标准所有权模型。非标准所有权也很可能需要在复制操作中处理。
根据下面广为人知的 table,当复制赋值、复制构造函数和析构函数中的一个或多个时,C++11 中不推荐自动编译器生成默认复制构造函数和复制赋值 is/are 由用户提供(红色单元格表示弃用)。鉴于 "Rule of 3",这是完全合理的。但是,table 表明在用户提供的副本 constructor/assignment.
的情况下,默认析构函数的生成并未被弃用这个设计决定背后的基本原理是什么?
为什么要弃用它?一个对象完全有可能需要特殊的复制属性,但它的销毁完全由它的子对象析构函数决定。考虑一个简单的克隆指针:
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 中做特殊的事情,那可能意味着 class 中存在一些非标准所有权模型。非标准所有权也很可能需要在复制操作中处理。