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

Accessing unique_ptrs in std must provide copy constructor?

本文关键字:复制 构造函数 ptrs std 访问 unique      更新时间:2023-10-16

我创建了一个 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 上提供一个避免实际制作副本的复制构造函数,否则它永远不会起作用。我说的对吗? 我想我看到了一些关于使用迭代器的帖子,但如果没有必要,我宁愿不要。

编辑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( ) };

C++不会为您决定是使用复制还是引用分配。

你应该自己处理。

  • 如果声明新变量并在声明行中使用=运算符,例如int y = x;则使用复制构造函数。
  • 如果声明一个前面带有&的变量,例如int & y = x;您正在获取x的参考并将其存储在y中。

在您的示例中,您有 2 个问题:

  1. 您正在尝试将unique_ptr<Foo>分配给Foo*即 不對。
  2. 您希望具有unique_ptr<Foo>引用,以便您 应该像这样声明unique_ptr<Foo>引用:unique_ptr<Foo> & ref = myVec[0];