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

C++ 使用std::move转储成员是否可以接受设计?,c++,c++11,return,factory,move,C++,C++11,Return,Factory,Move,假设我有一个C类,它的唯一目的是填充一个属于C的某个类型的容器容器。所以C拥有以特定方式填充容器的方法。在C填满con之后,我不再需要C,所以我想将con_n转储到另一个变量中。但C实际上是一个函子,因为C_m只能以增量方式填充,所以不能是填充函数的局部对象。此外,实现应该对用户隐藏,因此用户不需要在返回con_m的函数上调用std::move 这是std::move的适当用法吗 此外,实现应该对用户隐藏 移动对象的内容不是实现细节;这是函数正在做的一部分。通过移动对象的内容,可以使对象丢失其内

假设我有一个C类,它的唯一目的是填充一个属于C的某个类型的容器容器。所以C拥有以特定方式填充容器的方法。在C填满con之后,我不再需要C,所以我想将con_n转储到另一个变量中。但C实际上是一个函子,因为C_m只能以增量方式填充,所以不能是填充函数的局部对象。此外,实现应该对用户隐藏,因此用户不需要在返回con_m的函数上调用std::move

这是std::move的适当用法吗

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

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

原因是C++标准委员会让你不得不使用STD::明确地移动,这样人们阅读你的代码就能知道发生了什么。如果一个人看到c.dump_容器,他们可能会认为倾倒是通过复制发生的。如果他们看到std::movec.dump_容器,并且如果他们看到不能在左值引用上调用它,那么所有涉及的人都非常清楚c的状态将是什么

运动应该是明确的


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

听起来C的方法最好作为独立函数,将容器作为参数。如果容器不是一个成员,那么从类中挖掘出来就不会有问题。这似乎取决于移动构造函数是否将源对象保留在所需的状态。我会说否。一般来说,移动构造函数不需要将容器保留为空。不要认为这是一个好主意,因为意图其他人会看着它,扬起眉毛,要么弄明白你在干什么,要么做出可怕的、导致崩溃的假设。
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();
}