使用 std::move 转储成员的设计是否可以接受?

Is using std::move to dump a member acceptable design?

本文关键字:是否 move std 转储 成员 使用      更新时间:2023-10-16

假设我有一个类C其唯一目的是填充作为C成员的某种类型的容器con_m。因此,C拥有以特定方式填充con_m的方法。在C填满con我不再需要C,所以我想con_n转储到另一个变量中。但C实际上是一个函子,因为con_m只能增量填充,因此不能是填充函数的本地对象。此外,实现应该对用户隐藏,这样他就不需要在返回con_m的函数上调用std::move

template <class container_type> class C {
public:
template <class T> void fill_some_more(const T &t) {
// do stuff with t filling con_m by another increment
}
container_type dump_container() { return std::move(con_m); }
container_type con_m;
};
int main() {
C<std::vector<int>> c;
while (some_condition) {
c.fill_some_more(some_int);
}
auto con = c.dump_container();
}

这是std::move的适当使用吗?

此外,实现应该对用户隐藏

移动对象的内容不是实现细节;它是函数正在执行的操作的一部分。通过移动对象的内容,可以使对象丢失其内容,因此稍后调用的代码需要尊重这一事实。

C++标准委员会之所以让你必须明确地使用std::move,是因为阅读你的代码的人能够知道发生了什么。如果一个人看到c.dump_container(),他们可能会认为转储是通过复制发生的。如果他们看到std::move(c).dump_container(),如果他们看到他们不能在左值引用上调用它,那么所有相关人员都非常清楚之后c的状态会是什么。

移动应该是明确的。

当然,正如 Igor 在评论中指出的那样,如果这些是作用于用户提供的容器的自由函数,而不必让容器成为某种类型的成员,那么整个事情是可以避免的。