假设我有一个类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/

10-11 22:44
查看更多