在C 中將唯一的Ptr 捕獲到Lambda 表達式中
在C 中,在處理唯一指針和lambda 時,捕獲所有權可能具有挑戰性。一種常見的嘗試是透過引用傳遞 std::unique_ptr 並在 lambda 中捕獲它:
std::function<void()> getAction(std::unique_ptr<MyClass>& psomething); return [psomething]() { psomething->do_some_thing(); };
但是,由於生命週期問題,此方法無法編譯。為了解決這個問題,C 14 引入了lambda 廣義捕獲,它允許明確指定所有權轉移:
std::function<void()> getAction(std::unique_ptr<MyClass> psomething) { return [auto psomething = move(psomething)]() { psomething->do_some_thing(); }; }
透過使用auto psomething = move(psomething),唯一指針的所有權被轉移到lambda,從而消除生命週期問題。
但是,如果您有如圖所示的自訂移動和複製實現下面:
template<typename T> T copy(const T &t) { return t; } template<typename T> T move(T &t) { return std::move(t); }
對左值引用使用move 時應該小心,因為它可能會導致未定義的行為。例如,應避免使用 move(A()) 來移動臨時物件。相反,建議為左值和右值引用提供單獨的移動和複製版本。
因此,當將唯一指標捕獲到 lambda 表達式中時,lambda 廣義捕獲提供了一種方便且顯式的方法來處理所有權轉移,確保適當的生命週期管理。
以上是如何安全地捕捉 C Lambda 表達式中的唯一指標?的詳細內容。更多資訊請關注PHP中文網其他相關文章!