所以,在看了 这个关于右值引用的精彩讲座 之后,我认为每个班级都会受益于这样的“移动构造函数”, template<class T> MyClass(T&& other)
编辑,当然还有“移动赋值运算符”, template<class T> MyClass& operator=(T&& other)
正如菲利普在他的回答中指出的那样,如果它具有动态分配的成员,或者通常存储指针。就像如果前面提到的要点适用,你 应该 有一个复制ctor、赋值运算符和析构函数。想法?
原文由 Xeo 发布,翻译遵循 CC BY-SA 4.0 许可协议
我会说三法则变成三、四、五法则:
笔记:
特别是,以下完全有效的 C++03 多态基类:
应改写如下:
有点烦人,但可能比替代方案更好(在这种情况下,自动生成 仅 用于复制的特殊成员函数,没有移动的可能性)。
与不遵守规则会导致严重损害的三巨头规则相反,不明确声明移动构造函数和移动赋值运算符通常很好,但在效率方面往往不是最优的。如上所述,移动构造函数和移动赋值运算符只有在没有显式声明的复制构造函数、复制赋值运算符或析构函数时才会生成。这在复制构造函数和复制赋值运算符的自动生成方面与传统的 C++03 行为不对称,但更安全。因此,定义移动构造函数和移动赋值运算符的可能性非常有用,并创造了新的可能性(纯粹的可移动类),但遵守 C++03 三巨头规则的类仍然可以。
对于资源管理类,如果无法复制基础资源,您可以将复制构造函数和复制赋值运算符定义为已删除(视为定义)。通常您仍然需要移动构造函数和移动赋值运算符。复制和移动赋值运算符通常使用
swap
来实现,如在 C++03 中。谈论swap
;如果我们已经有一个移动构造函数和移动赋值运算符, 专门的std::swap
将变得 _不重要_,因为通用std::swap
使用移动构造函数和移动赋值运算符(如果可用)(和那应该足够快)。不用于资源管理(即没有非空析构函数)或子类型多态性(即没有虚拟析构函数)的类不应声明五个特殊成员函数中的任何一个;它们都将自动生成,并且行为正确且快速。