c++ - 尝试从 vector 中获取 unique_ptr 元素后出错

标签 c++ vector unique-ptr

我阅读了有关如何插入 unique_ptr<T> 的信息进入vector<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 视为右值,然后可以在 unique_ptr“移动复制构造函数”中使用。

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

如果您不想从 vector 中夺走指针的所有权,只需直接访问托管指针即可:

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

你必须小心不要在它指向的对象不复存在后使用a

关于c++ - 尝试从 vector 中获取 unique_ptr 元素后出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20773351/

相关文章:

c++ - 程序员需要 C++ 元模板知识吗?

c++ - 在 Cmakelist 中添加 Arpack/Armadillo

r - 确定 TRUE 和 FALSE 序列中最后 TRUE 的位置

c++ - 唯一指针如何保证唯一性?

c++ - 在 POSIX 操作系统上检测 SSD 存储设备

c++ - 在 vector 中查找对象时出错

java - 结果集为嵌套 vector ?

c++ - libc++abi.dylib:以 std::length_error 类型的未捕获异常终止: vector

C++ fatal error C1001 : An internal error has occurred in the compiler

c++ - std::list 可以包含不同的 std::unique_ptr<T> 吗?