移动包含值的对象

问题描述

我有一堂这样的课:

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); 仍然会。