在 std 中访问unique_ptrs必须提供复制构造函数?
Accessing unique_ptrs in std 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 的引用传递给函数,并尝试使用 [] 运算符访问向量中的数据。
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 个问题:
- 您正在尝试将
unique_ptr<Foo>
分配给Foo*
即 不對。 - 您希望具有
unique_ptr<Foo>
引用,以便您 应该像这样声明unique_ptr<Foo>
引用:unique_ptr<Foo> & ref = myVec[0];
相关文章:
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 为什么在C++中使用私有复制构造函数与删除复制构造函数
- 当从函数参数中的临时值调用复制构造函数时
- 如果有一个模板构造函数只有一个泛型参数,为什么我必须有一个复制构造函数
- 为什么需要复制构造函数,在哪些情况下它们非常有用
- 使用仅使用一次的变量调用的复制构造函数.这可能是通过调用move构造函数进行编译器优化的情况吗
- 为什么类中的ostringstream类型的成员会导致";调用隐含删除复制构造函数";错误
- 复制构造函数、赋值运算符C++
- std::ofstream 作为类成员删除复制构造函数?
- 复制构造函数C++无法正确复制指针
- 关于复制构造函数的一个棘手问题
- 为什么调用复制构造函数而不是移动构造函数?
- 填充上编译器生成的复制构造函数之间的不一致
- C++ 对象指针数组的复制构造函数
- C++ 基本 CTOR 说明 - 为什么不调用赋值/复制构造函数
- 防止在复制构造函数中隐式调用基构造函数
- 为用户定义的类正确调用复制构造函数/赋值运算符
- 具有已删除移动和复制构造函数的类的就地构造
- 复制构造函数隐式转换问题
- 复制构造函数中的递归调用