首頁 >後端開發 >C++ >我可以從移動捕獲 Lambda 表達式建立'std::function”嗎?

我可以從移動捕獲 Lambda 表達式建立'std::function”嗎?

Barbara Streisand
Barbara Streisand原創
2024-12-11 13:46:11976瀏覽

Can I Create an `std::function` from a Move-Capturing Lambda Expression?

從移動捕獲Lambda 表達式建立std::function

可以從移動捕獲Lambda 表達式構造std::function;

模板建構子

可以使用以下模板建構子從移動捕獲lambda 構造std::function:
template<class F>
function(F f);

要求

對於這個構造函數要工作,必須滿足以下要求:

lambda 表達式的捕獲必須是可複製構造的。

lambda 表達式必須是可呼叫的,具有指定的參數類型和傳回類型。

lambda 捕獲的複制構造函數和析構函數不得拋出異常
auto pi = std::make_unique<int>(0);

// Move-capturing lambda
auto foo = [q = std::move(pi)] {
    *q = 5;
    std::cout << *q << std::endl;
};

std::function<void()> bar = foo;
std::function<void()> bar{foo};
std::function<void()> bar{std::move(foo)};
std::function<void()> bar = std::move(foo);
std::function<void()> bar{std::forward<std::function<void()>>(foo)};
std::function<void()> bar = std::forward<std::function<void()>>(foo);
僅移動類型

不可能可以從移動的lambda 構造std::function捕捉僅移動類型。這是因為 std::function 的複製建構子和賦值運算子是根據需要可複製建構型別的建構子定義的。 範例考慮以下程式碼片段:嘗試使用下列任何方法從此lambda 建立std::function 會導致出現編譯錯誤:這是因為pi 是僅移動類型,而std::function 的複製建構子需要可複製構造的型別。 因此,如果您希望將移動捕獲 lambda 與 std::function 結合使用,請確保其捕獲是可複製構造的。

以上是我可以從移動捕獲 Lambda 表達式建立'std::function”嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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