首页 > 解决方案 > 访问 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 然后在某处手动释放它。我当然可以暂时转让所有权,直到我完成它然后归还所有权,但感觉很麻烦。对上述方法有什么想法吗?

提前致谢,/吉米

标签: c++vectorunique-ptr

解决方案


anObj变量应该是类型而std::unique_ptr<Foo>不是Foo*.

代码应该是:

std::unique_ptr<Foo>& anObj{ myVec[ 0 ] };

或者

Foo* anObj{ myVec[ 0 ].get( ) };


推荐阅读