如何在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
相关产品推荐
相关产品推荐

