移动包含值的对象

Moving an object that contains values

我有一个 class 这样的:

class Bla {
private:
    size_t length;
    ComplexClass expensiveData; // Very expensive, and Bla manages everything about someStuff, including its creation and deletion
};

现在假设我想做这样的事情:

Bla a = ...;
Bla b = ...;

a = b;

现在我认为会发生的是,当我将 a 赋值给 b 时,将调用复制赋值运算符。

问题是,如果我要深度复制 ab 的内容,那将非常昂贵。 总是 只做一个Bla 的浅拷贝会更好。但是,问题是 expensiveData 是一个常规值,而不是指针,这意味着如果我尝试将 expensiveData 重新分配给一个新对象,它只会复制它。

此外,expensiveData 是由我使用的库之一提供的,我无法更改它的工作方式。

我是不是应该:

  1. 删除复制赋值和复制构造函数操作符,因为我从来没有想做任何深复制,但后来失去了赋值的能力。
  2. expensiveData改成一个指针,然后在复制构造函数中重新分配指针即可。
  3. 使用其他方法,例如 std::movestd::swap?

存储指向 ComplexClass 的指针是可行的,但使用 raw 指针是不明智的。使用 std::shared_ptr<ComplexClass>.

或者,您可以删除复制构造函数和赋值,然后在需要赋值时将 Bla 存储在 shared_ptr 中。

而不是删除复制操作,您可以:

  • 将它们设为私有,并添加一个成员函数,该函数的名称长得吓人,可以执行它们,以备不时之需。
  • 只删除复制赋值,创建复制构造函数explicit。然后 a = b; 不会编译,但 a = Bla(b); 仍然会。