2017-03-07 22 views
0

假设我有一个类C,唯一的目的是填写C的某个类型的容器con_m。因此,C拥有以特定方式填写con_m的方法。 C已填满con我不再需要C,所以我想将con_n转储到另一个变量中。但是C实际上是一个仿函数,因为con_m只能递增填充,所以不能是填充函数的局部对象。此外,实现应该隐藏给用户,所以他不需要在返回con_m的函数上调用std::move是否使用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

+3

听起来像'C'的方法可能更适合以容器作为参数的独立函数。如果首先不是会员,那么您不会遇到将集装箱从课堂中挖出的问题。 –

+1

似乎取决于您的移动构造函数是否将源对象留在期望的状态 –

+0

我会说不。通常移动构造函数不需要将容器留空。 – immibis

回答

1

另外的实施应当对用户隐藏

移动对象的内容是不一个实现细节;它是功能的一部分。通过移动对象的内容,可以使对象失去其内容,因此稍后调用的代码需要尊重这一事实。

C++标准委员会之所以这么做,是因为您必须明确地使用std::move,才能让读取您的代码的人员能够知道发生了什么。如果一个人看到c.dump_container(),他们可能会认为倾销是通过复制发生的。如果他们看到std::move(c).dump_container(),并且如果他们发现他们不能不能通过将其称为左值参考,那么对每个参与者都很清楚c之后的状态。

运动应该是明确的。

当然,正如Igor在评论中指出的那样,如果这些功能是用户提供的容器上执行的自由函数,而不是让容器成为某种类型的成员,则可以避免这件事。

相关问题