【问题标题】:What's wrong with this initialization of unique_ptr?这个unique_ptr的初始化有什么问题?
【发布时间】:2015-03-04 11:29:57
【问题描述】:

谁能告诉我,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);

工作得很好。

【问题讨论】:

  • 试试py.reset(new int)
  • py = std::make_unique&lt;int&gt;();

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


【解决方案1】:

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

在第一个 sn-p 中失败的是赋值,这是因为 unique_ptr 没有 operator= 重载,它接受一个裸指针作为它的右手边。它确实接受另一个unique_ptr,所以你可以这样做:

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

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

py.reset(new int);

【讨论】:

  • 非常感谢所有回答的人——非常有帮助!
【解决方案2】:

关于

下面的unique_ptr初始化有什么问题?

问题不是初始化,而是下面的赋值。

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


关于

在做

unique_ptr<int> px(new int);

工作正常。

这是一个指向unique_ptr 的原始指针的赋值,这是有问题的,而不是初始化。

【讨论】:

  • @KonradRudolph:我觉得你的评论令人反感。
  • 然而你改变了答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-16
  • 1970-01-01
  • 2010-10-07
  • 1970-01-01
  • 2013-10-24
  • 1970-01-01
相关资源
最近更新 更多