在 std 向量中访问 unique_ptrs - 必须提供复制构造函数?

Accessing unique_ptrs in std vector - must provide copy constructor?

我创建了一个 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 的引用传递给函数并尝试使用 []-operators 访问向量中的数据。

void someFunc(vector<unique_ptr<Foo> > &myVec)
{
    Foo* anObj = myVec[0];
}

经过一些阅读,我猜想这种方法不会奏效,因为 std 向量会尝试制作一个副本,除非我在 Foo 上提供一个避免实际制作副本的复制构造函数,否则它永远不会奏效。我对么? 我想我看到了一些关于使用迭代器的帖子,但如果不需要,我宁愿不这样做。

编辑 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 然后在某处手动释放它即可。我当然可以暂时转让所有权,直到我完成它,然后 return 所有权,但这感觉很麻烦。对上述方法有什么想法吗?

提前致谢, /吉米

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

代码应为:

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

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

C++ 无法为您决定是使用复制还是引用赋值。

请自行处理。

  • 如果您声明新变量并在声明行中使用 = 运算符,例如 int y = x;,则您正在使用复制构造函数。
  • 如果你声明一个变量前加上&,比如int & y = x; 您正在引用 x 并将其存储在 y.

在你的例子中,你有两个问题:

  1. 您正在尝试将 unique_ptr<Foo> 分配给 Foo* 这是 不正确。
  2. 你想要 unique_ptr<Foo> 引用,这样你 应该像这样声明 unique_ptr<Foo> 引用: unique_ptr<Foo> & ref = myVec[0];