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

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

Susan Sarandon
Susan Sarandon原創
2024-12-17 01:22:25325瀏覽

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

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

理解從lambda 表達式建立std::function 物件的問題至關重要。可以使用移動捕獲來建立 lambda 表達式,但是當嘗試將它們封裝在 std::function 中時,可能會出現錯誤。

錯誤範例

多次嘗試將移動捕獲lambda 轉換為std::function 總是會導致錯誤「呼叫隱式刪除的複製構造函數'

移動捕獲Lambda的需要

在共享物件所有權的情況下,lambda 表達式中的移動捕獲變得必要不可行,例如在自訂 UI 庫中。這些函式庫提供了 on_mouse_down() 和 push_undo_action() 等方法來使用 std::function 註冊事件處理程序。為了確保資源的有效所有權,lambda 表達式中的移動捕獲優於早期繁瑣的「release/acquire-in-lambda」習慣用法。

對 std::function 構造的限制

直接指定函數物件的 std::function建構子有以下內容簽章:

template <class F> function(F f);

但是,另一個相關的建構函式接受分配器和對提供某些保證的類型的引用:

template <class F, class A> function(allocator_arg_t, const A& a, F f);

這些保證包括以下內容:

  • F 必須是可複製構造的
  • f必須可以使用提供的參數類型進行呼叫(ArgTypes) 和返回類型(R)
  • A 的複製構造函數和析構函數不得拋出異常

對Move-Capture 的適用性

雖然具有移動捕獲的lambda 表達式不會違反 F的可複製性要求,但它們通常會移動捕獲類型(例如std::unique_ptr) 不提供所需的複製構造函數。因此,從這些移動捕捉 lambda 構造 std::function 變得不可行。

結論

值得注意的是move- 的轉換由於std::function 構造函數在處理僅移動類型方面的限制,無法將lambda 捕獲到std: :function 。這個限制源自於 std::function 需要維護封裝函數物件的副本。

以上是為什麼我無法從移動捕獲 Lambda 創建'std::function”?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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