std::move_only_function
定義於標頭檔案 <functional> |
||
template< class... > class move_only_function; // 未定義 |
(1) | (C++23 起) |
template< class R, class... Args > class move_only_function<R(Args...)>; |
(2) | (C++23 起) |
類模板 std::move_only_function
是一個通用的多型函式包裝器。std::move_only_function
物件可以儲存和呼叫任何可構造(不要求是可移動構造)的 可呼叫 (Callable) 目標——函式、lambda 表示式、bind 表示式或其他函式物件,以及指向成員函式的指標和指向成員物件的指標。
所儲存的可呼叫物件稱為 std::move_only_function
的目標。如果 std::move_only_function
不包含任何目標,則稱為空的。與 std::function 不同,呼叫空的 std::move_only_function
會導致未定義行為。
std::move_only_function
支援其模板引數中提供的所有可能的 cv 限定符(不包括 volatile)、引用限定符和 noexcept 說明符的組合。這些限定符和說明符(如果有)會新增到其 operator()
中。
std::move_only_function
滿足 可移動構造 (MoveConstructible) 和 可移動賦值 (MoveAssignable) 的要求,但不滿足 可複製構造 (CopyConstructible) 或 可複製賦值 (CopyAssignable) 的要求。
目錄 |
[編輯] 成員型別
型別 | 定義 |
result_type
|
R
|
[編輯] 成員函式
構造新的 std::move_only_function 物件(public 成員函式) | |
銷燬 std::move_only_function 物件(public 成員函式) | |
替換或銷燬目標 (public 成員函式) | |
交換兩個 std::move_only_function 目標(public 成員函式) | |
檢查 std::move_only_function 是否有目標(public 成員函式) | |
呼叫目標 (public 成員函式) |
[編輯] 非成員函式
特化 std::swap 演算法 (函式) | |
(C++23) |
將 std::move_only_function 與 nullptr 進行比較(函式) |
[編輯] 注意
實現可以在 std::move_only_function
物件內部儲存小尺寸的可呼叫物件。這種小物件最佳化對於函式指標和 std::reference_wrapper 特化來說是有效必需的,並且只能應用於 std::is_nothrow_move_constructible_v<T> 為 true 的型別 T
。
如果返回引用的 std::move_only_function
用返回純右值(包括沒有尾隨返回型別的 lambda 表示式)的函式或函式物件初始化,則程式格式錯誤,因為禁止將返回的引用繫結到臨時物件。另請參閱 std::function
注意。
特性測試宏 | 值 | 標準 | 特性 |
---|---|---|---|
__cpp_lib_move_only_function |
202110L |
(C++23) | std::move_only_function
|
[編輯] 示例
#include <functional> #include <future> #include <iostream> int main() { std::packaged_task<double()> packaged_task([](){ return 3.14159; }); std::future<double> future = packaged_task.get_future(); auto lambda = [task = std::move(packaged_task)]() mutable { task(); }; // std::function<void()> function = std::move(lambda); // Error std::move_only_function<void()> function = std::move(lambda); // OK function(); std::cout << future.get(); }
輸出
3.14159
[編輯] 參閱
(C++11) |
任何可複製構造的可呼叫物件的包裝器 (類模板) |
(C++26) |
任何可呼叫物件的非擁有包裝器 (類模板) |
(C++26) |
任何可複製構造的可呼叫物件的包裝器,支援給定呼叫簽名中的限定符 (類模板) |