”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 如何在 C++ Lambda 中(尤其是 C++11 中)实现移动捕获?

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

发布于2024-12-23
浏览:836

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()
    .then([u = std::move(u)] { do_something_with(u); });

C 11 的解决方法

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

方法1:make_rref

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

template  using rref_impl = ...;
auto rref = make_rref(std::move(val));

[rref]() mutable { std::move(rref.get()); };

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

方法 2:capture() 函数

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

template  using capture_impl = ...;
auto lambda = capture(std::move(val), [](auto&& v) { return std::forward(v); });

这可以防止复制 lambda 和确保捕获的值移入 lambda 的作用域。

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

最新教程 更多>

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3