【问题标题】:c++ no matching function for call to vector push_back [duplicate]c ++没有用于调用向量push_back的匹配函数[重复]
【发布时间】:2016-08-09 04:23:43
【问题描述】:

我有一个这样的向量:

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&lt;std::unique_ptr&lt;Service&gt; &gt;::push_back(std::unique_ptr&lt;Service&gt;&amp;)

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

【问题讨论】:

标签: c++ c++11


【解决方案1】:

std::unique_ptr 无法复制,只能移动。

该类满足 MoveConstructible 和 MoveAssignable 的要求,但不满足 CopyConstructible 或 CopyAssignable 的要求。

std::make_unique&lt;Service&gt;() 是一个临时变量,可以作为右值并被移动,但你不能对命名变量做同样的事情。你可以使用std::move:

std::move用于表示一个对象t可能被“移出”

比如,

m_vec.push_back(std::move(pt));

【讨论】:

  • 感谢回答,如果我调用move,我还能重复使用pt吗?还是已经不存在了?
  • @user4016367 看你是什么意思“重用pt”,移动后,所有权已经从pt转移到m_vec的元素,它不拥有任何东西。
  • 我想让 m_vec 也保留所有权,怎么办?
  • @user4016367 你不能,unique_ptr 是唯一的,不能共享所有权。您可能需要shared_ptr,它通过指针保留对象的共享所有权。
【解决方案2】:

你想要的是

std::unique_ptr<Service> pt = std::make_unique<Service>();
m_vec.emplace_back(std::move(pt));

您不能复制unique_ptr,因为它们是独一无二的。你可以创建一个然后移动它。 emplace_back 将确保没有临时创建,并且元素是就地构造的(没有副本,临时等)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-25
    • 1970-01-01
    • 2013-07-23
    • 2020-07-06
    • 1970-01-01
    • 2020-09-11
    相关资源
    最近更新 更多