我有这样的矢量:
std::vector<std::unique_ptr<Service> > m_vec;
我可以像这样运行push_back:
m_vec.push_back(std::make_unique<Service>());
但是当我像这样运行时:
std::unique_ptr<Service> pt = std::make_unique<Service>();
m_vec.push_back(pt);
我收到错误no matching function for call to ‘std::vector<std::unique_ptr<Service> >::push_back(std::unique_ptr<Service>&)
&
是否意味着我正在推动对向量的引用?如果是这样,为什么我不能推送参考?
答案 0 :(得分:4)
std::unique_ptr
无法复制,只能移动。
该类满足MoveConstructible和MoveAssignable的要求,但不满足CopyConstructible或CopyAssignable的要求。
std::make_unique<Service>()
是一个临时变量,可以作为右值并被移动,但你不能对命名变量做同样的事情。您可以使用std::move
:
移出
std::move
用于表示对象t可以从&#34;
,例如,
m_vec.push_back(std::move(pt));
答案 1 :(得分:1)
你想要的是
std::unique_ptr<Service> pt = std::make_unique<Service>();
m_vec.emplace_back(std::move(pt));
您无法复制unique_ptr
,因为它们是唯一的。你可以创建一个,然后移动它。 emplace_back
将确保没有制作临时工具,并且元素就地构建(没有副本,临时工等)。