假设我有一个类C
,其唯一目的是填充属于con_m
成员的某种类型的容器C
。因此,C
具有以特定方式填充con_m
的方法。 C
填满con
后,我不再需要C
,因此我想将con_n
转储到另一个变量中。但是C
实际上是一个函子,因为con_m
只能增量填充,因此不能是填充函数局部的对象。同样,该实现也应该对用户隐藏,因此他不需要在返回std::move
的函数上调用con_m
。
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在评论中指出的那样,如果这些都是作用在用户提供的容器上的自由函数,而不必让容器成为某种类型的成员,则可以避免整个事情。
关于c++ - 使用std::move转储成员可接受的设计吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42639461/