首页 > 后端开发 > C++ > 为什么我无法从移动捕获 Lambda 创建 std::function?

为什么我无法从移动捕获 Lambda 创建 std::function?

Susan Sarandon
发布: 2024-12-13 10:10:11
原创
114 人浏览过

Why Can't I Create an std::function from a Move-Capturing Lambda?

从移动捕获 Lambda 构造 std::function

尝试从移动捕获 Lambda 表达式创建 std::function 时可能会遇到困难,尽管创建 lambda 本身没有任何问题。这是由于 std::function 构造函数及其赋值运算符施加的限制。

std::function 构造函数和运算符= 要求参数是可复制构造的。但是,捕获仅移动类型(例如 std::unique_ptr)的移动捕获 lambda 不能是可复制构造的。

澄清一下,移动捕获是指 lambda 表达式使用的捕获机制。与复制捕获(创建捕获变量的副本)相反,移动捕获将变量的所有权转移给 lambda。

您提供的代码说明了该问题:

auto pi = std::make_unique<int>(0);

auto foo = [q = std::move(pi)] {
    *q = 5;
    std::cout << *q << std::endl;
};

std::function<void()> bar = foo; // Error: attempts to copy-construct 'foo'
登录后复制

lambda 表达式 'foo' 通过 move 捕获唯一指针 'pi',使其成为仅移动类型。因此,从 'foo' 构造 std::function 是不可能的,因为 'foo' 无法复制。

要规避此限制,请考虑其他方法,例如使用 std::bind 或创建包装类它封装了 lambda 并提供了 CopyConstructible 接口。

以上是为什么我无法从移动捕获 Lambda 创建 std::function?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板