Я создал вектор std и сдвинул на него кучу объектов, используя ход std, например:
vector<unique_ptr<Foo> > myVec;
unique_ptr<Foo> a = make_unique<Foo>();
unique_ptr<Foo> b = make_unique<Foo>();
myVec.push_back(move(a));
myVec.push_back(move(b));
Пока все хорошо.
ПозжеЯ передаю ссылку на myVec в функцию и пытаюсь получить доступ к данным в векторе, используя [] -операторы.
void someFunc(vector<unique_ptr<Foo> > &myVec)
{
Foo* anObj = myVec[0];
}
После некоторого прочтения я предполагаю, что этот подход не будет работатьпотому что вектор std будет пытаться сделать копию, и если я не предоставлю конструктор копирования на Foo, который позволит избежать создания копии, он никогда не будет работать.Я прав?Я думаю, что я видел некоторые посты об использовании итераторов, но я бы предпочел не делать этого.
EDIT1:
Мне удалось обойти это следующим образом (используя итератор изатем получить необработанный указатель)
void someFunc(vector<unique_ptr<Foo> > &myVec)
{
int offset = 0; // Or some other offset into the vector
auto it = myVec.begin() + offset;
Foo* anObj = it.get();
// ... Do something using anObj here...
}
Я думаю, что это правильный путь, если вы не пытаетесь глупо сохранить anObj, а затем освободить его где-нибудь вручную.Конечно, я мог бы временно передать право собственности, пока я не покончу с этим, а затем вернуть право собственности, но это похоже на такую стычку.Есть мысли по поводу вышеуказанного подхода?
Заранее спасибо, / Джимми