0

假设我有 3 个类BaseDerivedChunkyDerived派生自Base,并且Base有一个类型的成员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不能改变)?

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

4

1 回答 1

1

是的,在第二种情况下移动仍然有好处,即使移动不在成员初始化器列表中。但请注意,在这种情况下,使用移动分配而不是移动构造,因此Chunky类型需要支持这一点。就Chunky这样std::function没关系。

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

于 2013-10-17T10:59:45.470 回答