【发布时间】:2017-01-21 08:59:37
【问题描述】:
假设我有一个包含一些数据的对象:
struct Object
{
std::vector<float> data;
}
还有一个包含一些对象的结构:
struct Holder
{
private:
std::vector<Object> objects_;
}
调用代码想要构建一个 Object 并将其添加到 Holder 而不创建副本,因为 Object 可能包含数百万个元素。我最初的想法是让 Holder 来处理这个动作:
struct Holder
{
void addObject(Object& object)
{
objects_.push_back(std::move(object));
}
private:
std::vector<Object> objects_;
}
但是,其他程序员可能不知道它传递给 Holder::addObject 的对象将使其处于未指定状态并继续对其进行处理。因此,我将其留给调用代码以将对象显式移动到副本中,否则将构造一个副本:
struct Holder
{
void addObject(Object object)
{
objects_.push_back(std::move(object));
}
private:
std::vector<Object> objects_;
}
调用代码如下:
Holder h;
Object o;
// populate c
h.addObject(std::move(o))
在这种情况下使用 std::move 是否正确?有没有其他更正确和明显的方法来处理这个问题?
【问题讨论】:
-
使
Object可移动但不可复制,如果你做错了什么,编译器会告诉你
标签: c++ move stdvector move-semantics