规则 3 C++ 中的默认成员弃用 11

Rule of 3 Default Member Deprecation in C++11

提问人:chili 提问时间:6/8/2017 最后编辑:chili 更新时间:6/8/2017 访问量:532

问:

根据下面广为人知的表,当用户提供一个或多个复制赋值、复制构造函数和析构函数时,默认复制构造函数和复制赋值的自动编译器生成在 C++11 中被弃用(红色单元格表示弃用)。根据“3法则”,这是完全有道理的。但是,该表显示,在用户提供的复制构造函数/赋值的情况下,不推荐使用默认析构函数的生成。

这个设计决策背后的基本原理是什么?

Reference Table

C++ C++11 三法则

评论

0赞 chili 6/8/2017
@Angew似乎是我倒过来的措辞;)感谢您的提醒,将编辑
0赞 Galik 6/8/2017
你怎么能没有析构函数?需要解构成员变量。
0赞 Angew is no longer proud of SO 6/8/2017
@Galik 这只是意味着 dtor 也必须由用户提供。
0赞 Galik 6/8/2017
@Angew 那会很奇怪。您始终希望成员变量能够构造和解构,而不必显式添加构造函数或析构函数。因此,编译器唯一不创建构造函数或析构函数的时间是用户提供构造函数或析构函数时。
1赞 Yakk - Adam Nevraumont 6/8/2017
我在该表中没有看到“已弃用”一词。是我错过了,还是你用错了词?

答:

2赞 Angew is no longer proud of SO 6/8/2017 #1

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

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 中做一些特殊的事情,这可能意味着在类中建模了一些非标准的所有权。非标准所有权很可能也需要在复制操作中处理。