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
オブジェクトを構築する
(公開メンバ関数) |
|
std::move_only_function
オブジェクトを破棄する
(公開メンバ関数) |
|
|
ターゲットを置き換えるか破棄する
(公開メンバ関数) |
|
2つの
std::move_only_function
オブジェクトのターゲットを交換する
(公開メンバ関数) |
|
std::move_only_function
がターゲットを持っているかチェックする
(公開メンバ関数) |
|
|
ターゲットを呼び出す
(公開メンバ関数) |
非メンバー関数
|
(C++23)
|
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); // エラー std::move_only_function<void()> function = std::move(lambda); // OK function(); std::cout << future.get(); }
出力:
3.14159
関連項目
|
(C++11)
|
任意のコピー構築可能な呼び出し可能オブジェクトのコピー可能ラッパー
(クラステンプレート) |
|
(C++26)
|
任意の呼び出し可能オブジェクトの非所有ラッパー
(クラステンプレート) |
|
(C++26)
|
指定された呼び出しシグネチャで修飾子をサポートする任意のコピー構築可能な呼び出し可能オブジェクトのコピー可能ラッパー
(クラステンプレート) |