Vic*_*tor 7 c++ vector unique-ptr
我读到了如何将a插入unique_ptr<T>到vector<unique_ptr<T>>:为什么我不能将unique_ptr push_back到向量中?
但是我如何获得一个元素呢?我做了一个例子:
#include <memory>
#include <vector>
class A {
public:
A(int x, int y){
x_ = x;
y_ = y;
}
private:
int x_;
int y_;
};
int main(){
std::vector<std::unique_ptr<A>> vec_a;
std::unique_ptr<A> tmp_a = std::unique_ptr<A>(new A(13,32));
vec_a.push_back(std::move(tmp_a));
vec_a.push_back(std::unique_ptr<A>(new A(3,2)));
// error
std::unique_ptr<A> a = vec_a.at(0);
}
Run Code Online (Sandbox Code Playgroud)
我收到此错误消息:
main.cc: In function ‘int main()’:
main.cc:24:36: error: use of deleted function
‘std::unique_ptr<_Tp, _Dp>::unique_ptr(const std::unique_ptr<_Tp, _Dp>&)
[with _Tp = A; _Dp = std::default_delete<A>]’
std::unique_ptr<A> a = vec_a.at(0);
^
In file included from /usr/include/c++/4.8/memory:81:0,
from main.cc:1:
/usr/include/c++/4.8/bits/unique_ptr.h:273:7: error: declared here
unique_ptr(const unique_ptr&) = delete;
^
Run Code Online (Sandbox Code Playgroud)
我做错了什么?我该怎么办?为什么这不起作用?
jua*_*nza 14
unique_ptr无法复制或分配.它需要移动复制或移动分配.您可以通过以下方式实现此目的std::move:
std::unique_ptr<A> a = std::move(vec_a.at(0));
Run Code Online (Sandbox Code Playgroud)
调用std::move基本上允许您将RHS视为右值,然后可以在unique_ptr'移动复制构造函数中使用.
请注意,在此之后,您必须小心第一个元素vec_a.
如果您不想将指针的所有权从向量中取出,只需直接访问托管指针:
A* a = vec_a.at(0).get();
Run Code Online (Sandbox Code Playgroud)
a在它指向的对象不再存在之后,你必须小心不要使用.
这是unique_ptr,您正在尝试制作副本。解决方法之一是获取原始指针:
A* a = vec_a.at(0).get();
Run Code Online (Sandbox Code Playgroud)
请记住,向量仍将拥有指针,并且当向量超出范围时仍将其删除。
| 归档时间: |
|
| 查看次数: |
4415 次 |
| 最近记录: |