Предположим, у меня есть объект, который содержит некоторые данные:Правильный тип параметра для перемещения объекта в вектор
struct Object
{
std::vector<float> data;
}
И структуру, которая содержит некоторые объекты:
struct Holder
{
private:
std::vector<Object> objects_;
}
телефонный код хочет построить объект и добавьте его в держатель без создания копий, поскольку объект может содержать миллионы элементов. Моя первая мысль была, чтобы грифели движения:
struct Holder
{
void addObject(Object& object)
{
objects_.push_back(std::move(object));
}
private:
std::vector<Object> objects_;
}
Однако другие программисты могут не знать, что объект он передается Держателю :: 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))
Является ли использование станд :: Переместить в этом контексте правильно? Есть ли альтернативный, более правильный и очевидный способ справиться с этим?
Make 'Object' подвижны, но не копируемые и компилятор сообщит вам, если вы делаете что-то неправильно – Slava