【问题标题】:remove unique_ptr from queue从队列中删除 unique_ptr
【发布时间】:2012-12-17 03:23:12
【问题描述】:

我正在尝试弄清楚如何/是否可以在 queue 中使用 unique_ptr

// 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(); 

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

【问题讨论】:

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


    【解决方案1】:

    你应该明确地说你想移动指针离开队列。像这样:

    std::unique_ptr<int> p2 = std::move(q.front());
    q.pop();
    

    【讨论】:

    • @iliacholy:粗略地说,q.front() 返回一个 l-value,所以你不能用它来复制初始化p2,因为unique_ptrs 是不可复制的。 std::move 将其转换为 r-value,因此现在 p2 正在被移动初始化,这是设计允许的。
    • 同样重要的是,在move 之后,queue 中的顶部元素是等于unique_ptrunique_ptr。需要 pop 从queue 中删除这个“空”unique_ptr
    • @Mordachai:异常安全需要它。
    • @rubenvb 严格来说,它不需要为空。从它移动构造后,它只是一个无效的对象,不拥有资源。当然,通过将其设为 null 最容易实现
    • @Mordachai:效率。有时您也可以通过front() 返回的引用使用队列中的对象,然后删除并忘记它。同样在 C++03 中,您无法为 pop() 实现有效的按值返回。
    猜你喜欢
    • 2016-01-31
    • 2018-12-11
    • 2012-08-17
    • 2013-05-15
    • 1970-01-01
    • 2012-07-12
    • 2017-03-28
    • 2012-11-05
    相关资源
    最近更新 更多