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