在 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
. 中
在你的例子中,你有两个问题:
- 您正在尝试将
unique_ptr<Foo>
分配给 Foo*
这是
不正确。
- 你想要
unique_ptr<Foo>
引用,这样你
应该像这样声明 unique_ptr<Foo>
引用:
unique_ptr<Foo> & ref = myVec[0];
我创建了一个 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
. 中
在你的例子中,你有两个问题:
- 您正在尝试将
unique_ptr<Foo>
分配给Foo*
这是 不正确。 - 你想要
unique_ptr<Foo>
引用,这样你 应该像这样声明unique_ptr<Foo>
引用:unique_ptr<Foo> & ref = myVec[0];