嘗試從移動捕獲Lambda 表達式建立std::function 時可能會遇到困難,儘管創建lambda 本身沒有任何問題。這是由於 std::function 建構函式及其賦值運算子所施加的限制。
std::function 建構子和運算子= 要求參數是可複製的構造。但是,捕獲僅移動類型(例如 std::unique_ptr)的移動捕獲 lambda 不能是可複製構造的。
澄清一下,移動捕獲是指 lambda 表達式使用的捕獲機制。與複製擷取(建立擷取變數的副本)相反,移動擷取將變數的所有權轉移給 lambda。
您提供的程式碼說明了該問題:
auto pi = std::make_unique<int>(0); auto foo = [q = std::move(pi)] { *q = 5; std::cout << *q << std::endl; }; std::function<void()> bar = foo; // Error: attempts to copy-construct 'foo'
lambda 表達式 'foo' 透過 move 擷取唯一指標 'pi',使其成為僅移動類型。因此,從 'foo' 構造 std::function 是不可能的,因為 'foo' 無法複製。
要規避此限制,請考慮其他方法,例如使用 std::bind 或建立包裝類別它封裝了 lambda 並提供了 CopyConstructible 介面。
以上是為什麼我無法從移動捕獲 Lambda 創建 std::function?的詳細內容。更多資訊請關注PHP中文網其他相關文章!