在构造定义某个大类型的基类成员的派生类时,我该如何传递该值?

时间:2013-10-17 10:34:59

标签: c++ inheritance move-semantics

假设我有3个班级:BaseDerivedChunkyDerived源自BaseBase的成员类型ChunkyChunky很大,我不想复制它,除非我必须)。

以下是Base,假设我们无法以任何方式更改它(不,我们无法为其创建构造函数):

class Base
{
public:
  Chunky monkey;
}

Derived看起来像这样:

class Derived : public Base
{
  // option 1
  Derived(Chunky const& monkey)
  {
    this->monkey = monkey;
  }

  // option 2
  Derived(Chunky monkey)
  {
    // does this do anything useful, or am I wasting my time by calling std::move?
    this->monkey = std::move(monkey);
  }
}

我更喜欢选项2,因为意图更清晰,我不必创建参考值,但是当std::move无法初始化时,我们仍然可以获得monkey的好处构造函数初始化列表? 如何解决这个问题(再次假设Base无法改变)?

如果有人想知道, monkey 在这种情况下是一个std :: function,而this discussion并没有真正回答我的问题。

1 个答案:

答案 0 :(得分:1)

是的,即使移动不在成员初始化列表中,在第二种情况下移动仍然有好处。但要注意,在这种情况下,使用移动赋值而不是移动构造,因此Chunky类型需要支持它。由于Chunkystd::function,所以可以。

第二个选项似乎更合适,因为与第一个选项相比,它可以避免复制。在更好的情况下,它只需要两个动作,但在更糟糕的情况下,执行一个副本然后移动。第一个选项总是需要一个副本。