You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C++14中通过Lambda转发std::unique_ptr至目标函数?

解决C++14中Lambda捕获std::unique_ptr后传递给目标函数的问题

你的问题核心是std::unique_ptr不可拷贝,Lambda内部捕获的j是左值,直接传递给需要值传递的printJob会触发拷贝构造,导致编译失败。以下是正确的实现方式:

问题分析

  • 你用C++14的初始化捕获j = std::move(jobptr),此时j的类型是std::unique_ptr<job>(通过移动构造初始化)。
  • 在Lambda内部,j是一个左值变量,而printJob的参数是std::unique_ptr<job>(值传递,要求转移所有权),直接传递j会尝试拷贝,违反unique_ptr的独占语义。

正确代码修改

只需在调用printJob时,用std::move()将j转换为右值,触发移动构造而非拷贝:

auto jobptr = std::make_unique<job>(<arguments>);

auto function = [this, j = std::move(jobptr)]
{
    printJob(std::move(j)); // 关键:用std::move转移j的所有权
};

注意事项

  • 这个Lambda只能被执行一次:执行后j的所有权已转移给printJob,j变为空指针,再次调用会传递空指针(若业务允许则没问题,比如线程只执行一次的场景)。
  • 若需要Lambda可多次执行,那只能改用std::shared_ptr,但这不符合你要求的现有代码风格,所以默认你的场景是Lambda仅执行一次。

内容的提问来源于stack exchange,提问作者Eric

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 11:42:23