C++:如何将 unique_ptr 推送到 deque?

Yur*_*ura 2 c++ unique-ptr move-semantics

在我的项目中,我需要包含指向数据单元实例的智能指针的容器。我写的类(简单的例子):

template <typename T>
class Queue
{
public:

    void push(const T & param) 
    {
        m_deque.push_front(param);
    }

private:
    std::deque<T> m_deque;
};
Run Code Online (Sandbox Code Playgroud)

比我想推一个:

int main()
{

    Queue< std::unique_ptr<DataBox> > queue;

    std::unique_ptr<DataBox> d1(new DataBox(11));

    queue.push(d1);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

而 VS2017 编译器说我不能这样做:

Error C2280 std::unique_ptr<DataBox,std::default_delete<_Ty>>::unique_ptr(const std::unique_ptr<_Ty,std::default_delete<_Ty>> &)': attempting to reference a deleted function

据我了解,错误的原因是尝试制作 unique_ptr 的副本。但是,如果我将签名更改为:

void push(T && param) {...}

和函数调用

queue.push( std::move(d1) );

我又犯了这个错误。所以问题是 - 我应该如何实现push()将移动unique_ptr到队列?

Jar*_*d42 7

您应该修改您的类以处理仅移动类型:

template <typename T>
class Queue
{
public:

    void push(const T & param) 
    {
        m_deque.push_front(param);
    }

    void push(T&& param) 
    {
        m_deque.push_front(std::move(param));
    }


private:
    std::deque<T> m_deque;
};
Run Code Online (Sandbox Code Playgroud)

使用情况:

int main()
{
    Queue< std::unique_ptr<DataBox> > queue;

    std::unique_ptr<DataBox> d1(new DataBox(11));

    queue.push(std::move(d1));
}
Run Code Online (Sandbox Code Playgroud)