从移动捕获 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 构造函数有以下内容签名: 这些保证包括以下内容: 对 Move-Capture 的适用性 虽然具有移动捕获的 lambda 表达式不会违反 F 的可复制性要求,但它们通常会移动捕获类型(例如std::unique_ptr) 不提供所需的复制构造函数。因此,从这些移动捕获 lambda 构造 std::function 变得不可行。 结论 值得注意的是 move- 的转换由于 std::function 构造函数在处理仅移动类型方面的限制,无法将 lambda 捕获到 std::function 。这个限制源于 std::function 需要维护封装函数对象的副本。 以上是为什么我无法从移动捕获 Lambda 创建'std::function”?的详细内容。更多信息请关注PHP中文网其他相关文章!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);