首頁 >後端開發 >C++ >如何正確捕捉 C Lambda 表達式中的唯一指標?

如何正確捕捉 C Lambda 表達式中的唯一指標?

Patricia Arquette
Patricia Arquette原創
2024-11-21 05:23:10606瀏覽

How Can I Correctly Capture Unique Pointers in C   Lambda Expressions?

捕捉 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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn