首頁 > 後端開發 > C++ > 如何在 C Lambda 中(尤其是 C 11 中)實現移動捕獲?

如何在 C Lambda 中(尤其是 C 11 中)實現移動捕獲?

Susan Sarandon
發布: 2024-12-10 14:51:10
原創
557 人瀏覽過

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

方法1:make_rref
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( ) Function
template <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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板