在 C 11 中,捕獲 lambda 中的變數通常是透過引用完成的。只要 lambda 存在,此引用就保持活動狀態,如果將捕獲的變數移出,有時可能會導致意外行為。
在 C 14 中,廣義引入了 lambda 捕獲,允許移動捕獲。這可以方便地操作僅移動類型,例如唯一指標。
std::make_unique<int>() .then([u = std::move(u)] { do_something_with(u); });
在C 14 之前,可以使用輔助函數來模擬移動捕獲:
template <typename T> using rref_impl = ...; auto rref = make_rref(std::move(val)); [rref]() mutable { std::move(rref.get()); };
此方法建立一個包裝類, rref_impl,封裝值並管理其生命週期。
但是,在 lambda 中捕獲 rref 允許複製它,可能會導致運行時錯誤。 方法2:capture( ) Functiontemplate <typename T, typename F> using capture_impl = ...; auto lambda = capture(std::move(val), [](auto&& v) { return std::forward<decltype(v)>(v); });
此方法使用函數,該函數透過引用取得捕獲的值並傳回一個lambda,該lambda 呼叫該函數並將捕獲的值作為
這可以防止複製lambda 並確保捕獲的值移至lambda 的作用域中。 請記住,這些解決方法不如 C 中的廣義 lambda 捕獲那麼優雅14,但它們提供了一種在該語言的早期版本中模擬移動捕捉的方法。以上是如何在 C Lambda 中(尤其是 C 11 中)實現移動捕獲?的詳細內容。更多資訊請關注PHP中文網其他相關文章!