我想知道我是否正确行事。我有一个包含一些数据的类:
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和其他不必要的细节。)
答案 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
)。