从队列中删除unique_ptr

Ili*_*oly 51 c++ unique-ptr c++11

我试图找出如何/我是否可以使用unique_ptrqueue.

// create queue
std::queue<std::unique_ptr<int>> q;

// add element
std::unique_ptr<int> p (new int{123});
q.push(std::move(p));

// try to grab the element
auto p2 = foo_queue.front();
q.pop(); 
Run Code Online (Sandbox Code Playgroud)

我明白为什么上面的代码不起作用.由于front&pop是2个单独的步骤,因此无法移动元素.有没有办法做到这一点?

ybu*_*ill 70

你应该明确地说,你要移动鼠标指针从队列中.像这样:

std::unique_ptr<int> p2 = std::move(q.front());
q.pop();
Run Code Online (Sandbox Code Playgroud)

  • 同样重要的是,在`move`之后,`queue`中的top元素是`unique_ptr`等于`nullptr`.需要pop来从`queue`中删除这个"empty"`unique_ptr`. (19认同)
  • @Mordachai:异常安全需要它. (3认同)
  • @iliacholy:松散地说,`q.front()`返回一个*l-value*,所以你不能用它复制初始化`p2`,因为`unique_ptr`是不可复制的.`std :: move`将它转换为*r值*,所以现在`p2`正在被移动初始化,这是设计所允许的. (2认同)