首页 > 后端开发 > C++ > 为什么我无法从具有不可复制对象的移动捕获 Lambda 创建'std::function”?

为什么我无法从具有不可复制对象的移动捕获 Lambda 创建'std::function”?

Linda Hamilton
发布: 2024-12-18 13:25:24
原创
866 人浏览过

Why Can't I Create an `std::function` from a Move-Capturing Lambda with a Non-Copyable Object?

从移动捕获 Lambda 表达式创建 std::function:揭示局限性

在 C 领域,构造 std::function 的任务来自移动捕获 lambda 表达式经常出现。虽然移动捕获 lambda 表达式本身可以无缝创建,但问题在于无法将它们封装在 std::function 中。

如我们的示例所示:

auto pi = std::make_unique<int>(0);
auto foo = [q = std::move(pi)] {
    *q = 5;
    std::cout << *q << std::endl;
};
登录后复制

这个示例毫不费力地构造一个移动捕获 lambda 表达式,不会遇到任何障碍。然而,当尝试在 std::function 中包含这个 lambda 时,我们遇到了一系列错误:

std::function<void()> bar = foo;
std::function<void()> bar{foo};
std::function<void()> bar{std::move(foo)};
std::function<void()> bar = std::move(foo);
std::function<void()> bar{std::forward<std::function<void()>>(foo)};
std::function<void()> bar = std::forward<std::function<void()>>(foo);
登录后复制

深入研究 std::function 类的复杂性,我们发现以下构造函数:

template<class F> function(F f);
登录后复制

这个构造函数揭示了根本问题:它需要封装的函数 F 是可复制构造的。然而,我们的移动捕获 lambda 表达式不满足这个标准;相反,它会移动捕获一个不可复制构造的对象。

因此,我们得出的结论是,虽然从移动捕获 lambda 表达式构造 std::function 是可行的,但当 lambda 表达式移动捕获不可复制构造的对象。在这种情况下,需要替代方法,例如“release/acquire-in-lambda”习惯用法。

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

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