捕捉 Lambda 表達式中的唯一指標
嘗試捕捉 Lambda 表達式中的唯一指標時,通常會遇到困難。考慮以下場景:
std::function<void()> getAction(std::unique_ptr<MyClass> &&psomething) { // Caller gives ownership of psomething return [psomething]() { psomething->do_some_thing(); // psomething is expected to be released after this point }; }
由於 lambda 無法透過引用捕獲唯一指針,因此上述程式碼無法編譯。為了解決這個問題,C 14 引入了 lambda 廣義捕獲。
C 14 中的 Lambda 廣義捕獲
Lambda 廣義捕獲允許按值或移動捕獲變數。這是透過在捕獲唯一指標時利用 = move() 語法來實現的,如下所示:
std::function<void()> getAction(std::unique_ptr<MyClass> psomething) { // Caller gives ownership of psomething return [auto psomething = std::move(psomething)]() { psomething->do_some_thing(); // psomething is expected to be released after this point }; }
透過使用 auto,lambda 會自動推導出 psomething 的類型,這是一個唯一指標。 = std::move(psomething) 表達式明確地將唯一指標的所有權移到 lambda 表達式中。
移動和複製的實現
複製的實現問題中提供的移動函數對於兩階段複製/移動有效(如[此StackOverflow 問題](https:/ /stackoverflow.com/questions/6322951/whats-the-difference- Between-a-copy-構造函數與移動構造函數))。
但是,需要注意的是,C 11 透過 std::move 表達式為 move 函數引入了不同的意義。 std::move 表達式右值限定它所應用到的對象,本質上表示它應該被移動。因此,在 lambda 廣義捕獲的上下文中,沒有必要在唯一指標上明確地呼叫 std::move;lambda 將根據需要自動移動所有權。
以上是如何正確捕捉 C Lambda 表達式中的唯一指標?的詳細內容。更多資訊請關注PHP中文網其他相關文章!