Namespaces
Variants

std::move_only_function

ja.cppreference.net より
 
 
ユーティリティライブラリ
言語サポート
型サポート (基本型、RTTI)
ライブラリ機能テストマクロ (C++20)
プログラムユーティリティ
可変引数関数
コルーチンサポート (C++20)
契約サポート (C++26)
三方比較
(C++20)
(C++20)(C++20)(C++20)    
(C++20)(C++20)(C++20)

汎用ユーティリティ
関係演算子 (C++20で非推奨)
整数比較関数
(C++20)(C++20)(C++20)    
(C++20)
Swap と 型操作
(C++14)
(C++11)
(C++11)
(C++11)
(C++17)
共通語彙型
(C++11)
(C++17)
(C++17)
(C++17)
(C++11)
(C++17)
(C++23)



 
関数オブジェクト
関数呼び出し
(C++17)(C++23)
恒等関数オブジェクト
(C++20)
透過的な演算子ラッパー
(C++14)
(C++14)
(C++14)
(C++14)  
(C++14)
(C++14)
(C++14)
(C++14)
(C++14)
(C++14)
(C++14)
(C++14)
(C++14)

旧式のバインダとアダプタ
(C++17まで*)
(C++17まで*)
(C++17まで*)
(C++17まで*)  
(C++17まで*)
(C++17まで*)(C++17まで*)(C++17まで*)(C++17まで*)
(C++20まで*)
(C++20まで*)
(C++17まで*)(C++17まで*)
(C++17まで*)(C++17まで*)

(C++17まで*)
(C++17まで*)(C++17まで*)(C++17まで*)(C++17まで*)
(C++20まで*)
(C++20まで*)
 
 
ヘッダ <functional>
template< class... >
class move_only_function; // not defined
で定義 (1) (C++23以降)
template< class R, class... Args >
class move_only_function<R(Args...)>;
template< class R, class... Args >
class move_only_function<R(Args...) noexcept>;
template< class R, class... Args >
class move_only_function<R(Args...) &>;
template< class R, class... Args >
class move_only_function<R(Args...) & noexcept>;
template< class R, class... Args >
class move_only_function<R(Args...) &&>;
template< class R, class... Args >
class move_only_function<R(Args...) && noexcept>;
template< class R, class... Args >
class move_only_function<R(Args...) const>;
template< class R, class... Args >
class move_only_function<R(Args...) const noexcept>;
template< class R, class... Args >
class move_only_function<R(Args...) const &>;
template< class R, class... Args >
class move_only_function<R(Args...) const & noexcept>;
template< class R, class... Args >
class move_only_function<R(Args...) const &&>;
template< class R, class... Args >
class move_only_function<R(Args...) const && noexcept>;
(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 がターゲットを持っているかチェックする
(公開メンバ関数)
ターゲットを呼び出す
(公開メンバ関数)

非メンバー関数

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)
任意のコピー構築可能な呼び出し可能オブジェクトのコピー可能ラッパー
(クラステンプレート)
任意の呼び出し可能オブジェクトの非所有ラッパー
(クラステンプレート)
指定された呼び出しシグネチャで修飾子をサポートする任意のコピー構築可能な呼び出し可能オブジェクトのコピー可能ラッパー
(クラステンプレート)