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) ターゲット — 関数、ラムダ式、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 メンバ関数) | |
2つの 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 が、prvalue (末尾戻り値型を持たないラムダ式を含む) を返す関数または関数オブジェクトで初期化された場合、返された参照を一時オブジェクトにバインドすることは禁止されているため、プログラムは不正です。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) |
所与の呼び出しシグネチャにおける修飾子をサポートする、任意のコピー構築可能な呼び出し可能オブジェクトのコピー可能なラッパー (クラステンプレート) |