移动 class 个数据成员 (C++)

move class data members (C++)

我想知道我这样做是否正确。我有一个 class 保存一些数据:

class Foo {
// ...
  Type a_;
  Type b_;
  Type c_;
};

还有一个不同的 class,它做其他事情,但使用 class Foo 构建。所以,我想像这样声明一个 ctor:

class Bar {
  Type a_;
  Type b_;
  Type c_;
  AnotherType A_;
  AnotherType B_;
  // ...
public:
  typedef std::tuple<Type, Type, Type> Tuple;

  Bar(const Tuple&);
  Bar(Tuple&&);
};

我现在需要创建一个 Foo 方法,它将 return 一个 Bar 需要的数据成员的元组,我可以将其传递给 Bar's演员。我还为 Tuple 创建了一个右值引用,因为 class Foo 的那些数据成员将不再需要,除非通过 class Bar,那么当我可以移动数据时,为什么还要复制数据呢?

因此,我在 class Foo 中创建了一个 return 和 Tuple 的方法。特别是,我需要一个可以由使用右值引用的 Bar 构造函数使用的对象。以下是正确的吗?

auto Foo::move_data() -> Tuple&& {
  return std::move( Tuple(a_, b_, c_) );
}

或者这是完全错误的? (指出任何其他愚蠢的事情也将不胜感激。当然,我遗漏了一些类型定义和其他不必要的细节。)

不,不是。这个:

Tuple&& Foo::move_data() {
    return std::move( Tuple(a_, b_, c_) );
}

会将您的元素复制到 Tuple 中,然后 move 复制 Tuple 本身……而不是您的元素。你想要做的是将它们移动到 Tuple,然后return它的值:

Tuple Foo::move_data() {
    return Tuple(std::move(a_), std::move(b_), std::move(c_) );
}

这在很大程度上取决于整体代码,但根据您的问题描述,我的问题是为什么不将 a、b 和 c 放在它们自己的结构中?

class Abc {
    Type a_;
    Type b_;
    Type c_;
};

class Foo {
    // ...
    Abc abc_;
    int somethingNotInBar_;
};

class Bar {
    Abc abc_;
    AnotherType A_;
    AnotherType B_;
    // ...
public:
    Bar(const ABC&);
};

一些优点:

  • 它可以省去求助于元组的麻烦;
  • 这将使代码更容易掌握(通常更难理解元组是什么,因为在此过程中会丢失名称);
  • 它会使修改更容易(那天你意识到你还需要 d,或者你不再需要 b)。