移动类数据成员(C ++)

时间:2015-01-26 03:33:10

标签: c++ c++11 move-semantics

我想知道我是否正确行事。我有一个包含一些数据的类:

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

另一个做其他事情的类,但使用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方法,该方法将返回Bar所需数据成员的元组,我可以将其传递给Bar的ctor。我还为Tuple制作了左值参考,因为class Foo除了class Bar之外不再需要class Foo的数据成员,所以为什么在我移动数据时还要复制数据呢?

因此,我在Tuple中创建了一个返回Bar的方法。特别是,我需要一个可以由使用右值引用的auto Foo::move_data() -> Tuple&& { return std::move( Tuple(a_, b_, c_) ); } ctor使用的一个。以下是否正确?

{{1}}

或者这完全错了? (指出其他任何愚蠢的东西也会受到赞赏。当然,我还遗漏了一些typedef和其他不必要的细节。)

2 个答案:

答案 0 :(得分:6)

不,不是。这样:

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

会将您的元素复制到Tuple,然后move Tuple本身...而不是您的元素。您希望做的是将移动到 Tuple,然后按值返回:

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

答案 1 :(得分:0)

这在很大程度上取决于整体代码,但是从你的问题描述中我的问题是为什么不将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)。