这个unique_ptr的初始化有什么问题?

时间:2015-03-04 11:29:57

标签: c++ c++11 initialization unique-ptr

有人可以告诉我,下面的unique_ptr初始化有什么问题吗?

int main()
{
  unique_ptr<int> py(nullptr);
  py = new int;
  ....
}

g ++ -O2 xxx.cc -lm -o xxx -std = c ++ 11说:

error: no match for ‘operator=’ (operand types are    ‘std::unique_ptr<int>’ and ‘int*’)
   py = new int;
      ^

否则

unique_ptr<int> px(new int);

工作正常。

2 个答案:

答案 0 :(得分:9)

初始化在两段代码中都很好,unique_ptrnullptr和裸指针都有constructors

第一个片段中失败的是分配,这是因为unique_ptr没有operator=重载,它接受裸指针作为其右侧。它确实接受了另一个unique_ptr,所以你可以这样做:

py = unique_ptr<int>{new int};
py = std::make_unique<int>(); // Since c++14

或者你可以看一下reset,它也接受一个裸指针并且或多或少有相同的含义:

py.reset(new int);

答案 1 :(得分:7)

关于

  

以下初始化unique_ptr有什么问题?

初始化不是有问题的,而是以下任务。

错误消息中的插入符号(向上箭头)指向的位置:在分配处。强提示:使用reset成员函数,或创建unique_ptr实例。


关于

  

操作

unique_ptr<int> px(new int);
     

工作正常。

指向unique_ptr的原始指针的分配是有问题的,而不是初始化。