在C++中编写移动构造函数时,是否必须编写复制构造函数



我知道五条规则,该规则规定,如果实现析构函数,则很可能还应实现复制构造函数、复制赋值运算符、移动构造函数和移动赋值运算符。

但是,如果我实现了移动操作符,我是否绝对必须实现复制操作符,或者这只是最佳实践?

;零规则";可能适用于您的情况。为什么首先要提供移动构造函数或移动赋值运算符?是因为你的类代表某种资源的唯一所有权吗?如果是这样,最好将该资源的所有权封装在unique_ptr成员或类似的成员中。然后,您就不需要再编写move构造函数和move赋值运算符了。编译器将自动生成它们,这将移动unique_ptr成员,从而转移所有权。编译器还将确保该类不可复制。

好吧,但我们假设,由于某些原因,零规则不适合您的类。如果只声明一个move构造函数,会发生什么?然后,编译器将隐式禁用类的复制,这意味着类类型的对象只能从相同类型的右值初始化,而不能从左值初始化。"五条规则"告诉你,最好明确说明这种情况,而不是让读者猜测编译器在做什么。因此,将复制构造函数定义为= delete;的最佳实践(但不是必需的(。

最新更新