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到队列?
您应该修改您的类以处理仅移动类型:
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)