【问题标题】:why can't i pass a reference to my unique_ptr?为什么我不能传递对我的 unique_ptr 的引用?
【发布时间】:2020-10-24 07:42:31
【问题描述】:

我有一个std::unique_ptr<k_ctrl_t> 的向量,我想将这个向量中的unique_ptr 的引用传递给另一个函数:

std::vector<std::unique_ptr<k_ctrl_t>> _kitchens;

for (int i = 0; i < (int)_kitchens.size(); i++)
{
    if (FD_ISSET(_kitchens[i]->socket, &this->_readfds))
    {
        handleKitchenRet(std::cref<std::unique_ptr<k_ctrl_t>>(_kitchens[i]));
    }
}

void Reception::handleKitchenRet(std::unique_ptr<k_ctrl_t> kitch)
{
    ...
}

但这不起作用。我怎么能这样做?

错误信息:

错误:使用已删除的函数 'std::unique_ptr<_tp _dp>::unique_ptr(const std::unique_ptr<_tp _dp>&) [with _Tp = kitchen_control_s; _Dp = std::default_delete]' 169 | handleKitchenRet(std::ref(_kitchens[i]));

【问题讨论】:

  • Reception::handleKitchenRet(std::unique_ptr&lt;k_ctrl_t&gt; kitch) - 参考在哪里?与此相关的是,导致您悲伤的错误消息在哪里,但无论出于何种原因您选择包含在您的帖子中?
  • 您正在尝试制作std::unique_ptr副本,正如“独特”的名称所暗示的那样,这是不可能的。你想做什么? handleKitchenRet 是否应该通过引用而不是值来获取 unique_ptr 参数?
  • 你可以尝试使用std::move,或者你可以用shared_ptr修改unique_ptr
  • Herb Sutter 会推荐 void Reception::handleKitchenRet(k_ctrl_t const&amp; kitch)void Reception::handleKitchenRet(k_ctrl_t&amp; kitch)void Reception::handleKitchenRet(k_ctrl_t const* kitch)void Reception::handleKitchenRet(k_ctrl_t* kitch)。如果您要传递所有权,则只有 unique_ptr 作为参数。

标签: c++ vector reference


【解决方案1】:
void Reception::handleKitchenRet(std::unique_ptr kitch)

通过获取unique_ptr

要通过参考获取,请将签名更改为

void Reception::handleKitchenRet(std::unique_ptr& kitch)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-22
    • 2016-08-16
    • 2017-03-03
    • 2012-08-20
    • 1970-01-01
    • 2012-01-15
    • 2011-01-14
    • 2015-08-22
    相关资源
    最近更新 更多