在 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