c ++没有用于调用vector push_back的匹配函数

时间:2016-04-17 13:06:22

标签: c++ c++11

我有这样的矢量:

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>&)

&是否意味着我正在推动对向量的引用?如果是这样,为什么我不能推送参考?

2 个答案:

答案 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将确保没有制作临时工具,并且元素就地构建(没有副本,临时工等)。