在 C 11 中,捕获 lambda 中的变量通常是通过引用完成的。只要 lambda 存在,此引用就保持活动状态,如果将捕获的变量移出,有时可能会导致意外行为。
在 C 14 中,广义引入了 lambda 捕获,允许移动捕获。这可以方便地操作仅移动类型,例如唯一指针。
std::make_unique<int>() .then([u = std::move(u)] { do_something_with(u); });
在 C 14 之前,可以使用辅助函数来模拟移动捕获:
此方法创建一个包装类, rref_impl,封装值并管理其生命周期。
template <typename T> using rref_impl = ...; auto rref = make_rref(std::move(val)); [rref]() mutable { std::move(rref.get()); };
但是,在 lambda 中捕获 rref 允许复制它,可能会导致运行时错误。
此方法使用一个函数,该函数通过引用获取捕获的值并返回一个 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中文网其他相关文章!