c – 尝试从向量中获取unique_ptr元素后出错

前端之家收集整理的这篇文章主要介绍了c – 尝试从向量中获取unique_ptr元素后出错前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我读到了如何插入unique_ptr< T>到矢量< unique_ptr< T>>: Why can I not push_back a unique_ptr into a vector?

但是我如何获得一个元素呢?我做了一个例子:

#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);
}

我收到此错误消息:

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;
       ^

我做错了什么?我该怎么办?为什么这不起作用?

解决方法

unique_ptr无法复制或分配.它需要移动复制或移动分配.你可以通过使用std :: move来实现这个目的:
std::unique_ptr<A> a = std::move(vec_a.at(0));

对std :: move的调用本质上允许您将RHS视为rvalue,然后可以在unique_ptr’a移动复制构造函数中使用它.

请注意,在此之后,您必须小心vec_a的第一个元素.

如果您不想将指针的所有权从向量中取出,只需直接访问托管指针:

A* a = vec_a.at(0).get();

在它指向的对象不再存在之后,你必须小心不要使用a.

猜你在找的C&C++相关文章