首页 > 后端开发 > C++ > 如何在 C Lambda 中(尤其是 C 11 中)实现移动捕获?

如何在 C Lambda 中(尤其是 C 11 中)实现移动捕获?

Susan Sarandon
发布: 2024-12-10 14:51:10
原创
532 人浏览过

How Can I Achieve Move Capture in C   Lambdas, Especially in C  11?

了解 C Lambda 中的移动捕获

在 C 11 中,捕获 lambda 中的变量通常是通过引用完成的。只要 lambda 存在,此引用就保持活动状态,如果将捕获的变量移出,有时可能会导致意外行为。

A C 14 解决方案:广义 Lambda 捕获

在 C 14 中,广义引入了 lambda 捕获,允许移动捕获。这可以方便地操作仅移动类型,例如唯一指针。

std::make_unique<int>()
    .then([u = std::move(u)] { do_something_with(u); });
登录后复制

C 11 的解决方法

在 C 14 之前,可以使用辅助函数来模拟移动捕获:

方法 1:make_rref

此方法创建一个包装类, rref_impl,封装值并管理其生命周期。

template <typename T> using rref_impl = ...;
auto rref = make_rref(std::move(val));

[rref]() mutable { std::move(rref.get()); };
登录后复制

但是,在 lambda 中捕获 rref 允许复制它,可能会导致运行时错误。

方法 2:capture( ) Function

此方法使用一个函数,该函数通过引用获取捕获的值并返回一个 lambda,该 lambda 调用该函数并将捕获的值作为

template <typename T, typename F> using capture_impl = ...;
auto lambda = capture(std::move(val), [](auto&& v) { return std::forward<decltype(v)>(v); });
登录后复制

这可以防止复制 lambda 并确保捕获的值移至 lambda 的作用域中。

请记住,这些解决方法不如 C 中的广义 lambda 捕获那么优雅14,但它们提供了一种在该语言的早期版本中模拟移动捕捉的方法。

以上是如何在 C Lambda 中(尤其是 C 11 中)实现移动捕获?的详细内容。更多信息请关注PHP中文网其他相关文章!

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