c++ - 访问 std 向量中的 unique_ptrs - 必须提供复制构造函数?
问题描述
我创建了一个 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 上提供一个 copyconstructor 以避免实际制作副本,否则它将永远无法工作。我对么?我想我看到了一些关于使用迭代器的帖子,但如果我不必这样做,我宁愿不这样做。
编辑1:
我确实设法通过以下方式解决它(使用迭代器,然后获取原始指针)
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 然后在某处手动释放它。我当然可以暂时转让所有权,直到我完成它然后归还所有权,但感觉很麻烦。对上述方法有什么想法吗?
提前致谢,/吉米
解决方案
anObj
变量应该是类型而std::unique_ptr<Foo>
不是Foo*
.
代码应该是:
std::unique_ptr<Foo>& anObj{ myVec[ 0 ] };
或者
Foo* anObj{ myVec[ 0 ].get( ) };