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

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

Susan Sarandon
Susan Sarandon原创
2024-12-17 01:22:25280浏览

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

从移动捕获 Lambda 表达式创建 std::function

理解从 lambda 表达式创建 std::function 对象的问题至关重要。可以使用移动捕获创建 lambda 表达式,但是当尝试将它们封装在 std::function 中时,可能会出现错误。

错误示例

多次尝试将移动捕获 lambda 转换为 std::function 始终会导致错误“调用隐式删除的复制构造函数'

移动捕获 Lambda 的需要

在共享对象所有权的情况下,lambda 表达式中的移动捕获变得必要不可行,例如在自定义 UI 库中。这些库提供了 on_mouse_down() 和 push_undo_action() 等方法来使用 std::function 注册事件处理程序。为了确保资源的有效所有权,lambda 表达式中的移动捕获优于早期繁琐的“release/acquire-in-lambda”习惯用法。

对 std::function 构造的限制

直接指定函数对象的 std::function 构造函数有以下内容签名:

template <class F> function(F f);</p>
<p>但是,另一个相关的构造函数接受分配器和对提供某些保证的类型的引用:</p>
<pre class="brush:php;toolbar:false">template <class F, class A> function(allocator_arg_t, const A& a, F f);

这些保证包括以下内容:

  • F 必须是可复制构造的
  • f 必须可以使用提供的参数类型进行调用(ArgTypes) 和返回类型 (R)
  • A 的复制构造函数和析构函数不得抛出异常

对 Move-Capture 的适用性

虽然具有移动捕获的 lambda 表达式不会违反 F 的可复制性要求,但它们通常会移动捕获类型(例如std::unique_ptr) 不提供所需的复制构造函数。因此,从这些移动捕获 lambda 构造 std::function 变得不可行。

结论

值得注意的是 move- 的转换由于 std::function 构造函数在处理仅移动类型方面的限制,无法将 lambda 捕获到 std::function 。这个限制源于 std::function 需要维护封装函数对象的副本。

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

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn