使用 std::move 转储成员的设计是否可以接受?
Is using std::move to dump a member acceptable design?
假设我有一个类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 在评论中指出的那样,如果这些是作用于用户提供的容器的自由函数,而不必让容器成为某种类型的成员,那么整个事情是可以避免的。
相关文章:
- 关于std::move的使用,是否有编译警告
- 是否可以在 C++03 中定义'move-and-swap idiom'等效项
- '[](std::list& list)<int>{return std::move(list)}(list)' 是否保证将 'list' 留空?
- 是否有必要使用 std::move?这不是已经是一个右值参考了吗?
- 使用 std::move 将参数传递给函数,如果该参数声明为按值传递或使用移动操作数 &&,是否有区别?
- 编译器是否足够聪明,以至于 std::move 变量超出范围?
- 在构造函数中初始化成员时,是否应该在成员上使用 std::move?
- 在返回语句中构造对象时,std::move() 是否有助于或阻止 RVO?
- std::move 是否始终按预期工作
- 防御性地应用 std::move 到平凡可复制的类型是否不可取
- 如果对象在同一层次结构中,-Wreturn-std-move clang 警告是否正确
- 是否可以 std::move 局部堆栈变量?
- 移动变量是否有效,可以在 std::move 之后使用
- 使用 std::move 转储成员的设计是否可以接受?
- std::vector的move构造函数是否调用项的move构造器
- 是否可以将 std::move 对象移出函数?(C++11).
- std::move on std::string 是否保证 .c_str() 返回相同的结果
- 检查容器上是否完成了std::move
- std::basic_string是否正式具有隐式生成的move构造函数
- 在 std::move 之后重复使用 std 容器是否安全