首頁 > 後端開發 > C++ > 為什麼我無法從移動捕獲 Lambda 創建 std::function?

為什麼我無法從移動捕獲 Lambda 創建 std::function?

Susan Sarandon
發布: 2024-12-13 10:10:11
原創
114 人瀏覽過

Why Can't I Create an std::function from a Move-Capturing Lambda?

從移動捕獲Lambda 構造std::function

嘗試從移動捕獲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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板