Namespaces
Variants

std:: move_only_function

From cppreference.net
Utilities library
Function objects
Function wrappers
(C++11)
move_only_function
(C++23)
(C++11)
Function invocation
(C++17) (C++23)
Identity function object
(C++20)
Old binders and adaptors
( until C++17* )
( until C++17* )
( until C++17* )
( until C++17* )
( until C++17* ) ( until C++17* ) ( until C++17* ) ( until C++17* )
( until C++20* )
( until C++20* )
( until C++17* ) ( until C++17* )
( until C++17* ) ( until C++17* )

( until C++17* )
( until C++17* ) ( until C++17* ) ( until C++17* ) ( until C++17* )
( until C++20* )
( until C++20* )
ヘッダーで定義 <functional>
template < class ... >
class move_only_function ; // 未定義
(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)
任意のコピー構築可能な呼び出し可能オブジェクトのコピー可能ラッパー
(クラステンプレート)
任意の呼び出し可能オブジェクトの非所有ラッパー
(クラステンプレート)
指定された呼び出しシグネチャで修飾子をサポートする任意のコピー構築可能な呼び出し可能オブジェクトのコピー可能ラッパー
(クラステンプレート)