Namespaces
Variants

std::function_ref::function_ref

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まで*)
 
 
template< class F >
function_ref( F* f ) noexcept;
(1) (C++26 から)
template< class F >
function_ref( F&& f ) noexcept;
(2) (C++26 から)
template< auto f >
function_ref( std::nontype_t<f> ) noexcept;
(3) (C++26 から)
template< auto f, class U >
function_ref( std::nontype_t<f>, U&& obj ) noexcept;
(4) (C++26 から)
template< auto f, class T >
function_ref( std::nontype_t<f>, /*cv*/ T* obj ) noexcept;
(5) (C++26 から)
function_ref( const function_ref& other ) = default;
(6) (C++26 から)

新しい std::function_ref を構築する。

1) bound-entity を f で初期化し、thunk-ptr を関数 thunk のアドレスで初期化する。f がヌルポインタの場合、動作は未定義である。
  • このオーバーロードは、std::is_function_v<F> と /*is-invocable-using*/<F> の両方が true である場合にのみオーバーロード解決に参加する。
2) bound-entity を std::addressof(f) で初期化し、thunk-ptr を関数 thunk のアドレスで初期化する。
  • T を std::remove_reference_t<F> とする。このオーバーロードは、以下の場合にのみオーバーロード解決に参加する :
    • std::remove_cvref_t<F> が function_ref と同じ型でなく、
    • std::is_member_pointer_v<T> が false であり、かつ
    • /*is-invocable-using*/</*cv*/ T&> が true であること。
3) bound-entity を未指定のオブジェクトへのポインタまたはヌルポインタ値で初期化し、thunk-ptr を関数 thunk のアドレスで初期化する。
  • F を decltype(f) とする。このオーバーロードは、/*is-invocable-using*/<F> が true である場合にのみオーバーロード解決に参加する。
  • f != nullptr が false であり、かつ std::is_pointer_v<F> || std::is_member_pointer_v<F> が true である場合、プログラムは ill-formed である。
4) bound-entity を std::addressof(obj) で初期化し、thunk-ptr を関数 thunk のアドレスで初期化する。
  • T を std::remove_reference_t<U> とし、F を decltype(f) とする。このオーバーロードは、以下の場合にのみオーバーロード解決に参加する :
    • std::is_rvalue_reference_v<U&&> が false であり、かつ
    • /*is-invocable-using*/<F, /*cv*/ T&> が true であること。
  • f != nullptr が false であり、かつ std::is_pointer_v<F> || std::is_member_pointer_v<F> が true である場合、プログラムは ill-formed である。
5) bound-entity を obj で初期化し、thunk-ptr を関数 thunk のアドレスで初期化する。obj がヌルポインタであり、かつ std::is_member_pointer_v<F> が true である場合、動作は未定義である。
  • F を decltype(f) とする。このオーバーロードは、/*is-invocable-using*/<F, /*cv*/ T*> が true である場合にのみオーバーロード解決に参加する。
  • f != nullptr が false であり、かつ std::is_pointer_v<F> || std::is_member_pointer_v<F> が true である場合、プログラムは ill-formed である。
6) デフォルト化されたコピーコンストラクタは、bound-entity と thunk-ptr を other からコピーする。

関数 thunk のアドレスは、thunk-ptr を初期化するために使用され、thunk(bound-entity, call-args...) の呼び出しが以下と式等価になるようにする:

オーバーロード 式等価
(1,3) std::invoke_r<R>(f, call-args...)
(2) std::invoke_r<R>(static_cast<cvT&>(f), call-args...)
(4) std::invoke_r<R>(f, static_cast<cvT&>(obj), call-args...)
(5) std::invoke_r<R>(f, obj, call-args...)

/*is-invocable-using*/<T...> は、以下の場合に限り true である:

  • std::is_nothrow_invocable_r_v<R, T..., Args...> は、true もし noex が true である場合、または
  • std::is_invocable_r_v<R, T..., Args...> は true

パラメータ

other - コピー元の別の function_ref
f - ラップする関数または Callable オブジェクト
obj - バインドするオブジェクトまたはポインタ

例

関連項目

std::move_only_functionオブジェクトを構築する
(std::move_only_functionの公開メンバ関数)