template<class F> function_ref(F* f) noexcept; // (1)
template<class F>
constexpr function_ref(F&& f) noexcept; // (2)
template<auto f>
constexpr function_ref(nontype_t<f>) noexcept; // (3)
template<auto f, class U>
constexpr function_ref(nontype_t<f>, U&& obj) noexcept; // (4)
template<auto f, class T>
constexpr function_ref(nontype_t<f>, /*cv*/ T* obj) noexcept; // (5)
constexpr function_ref(const function_ref&) noexcept = default; // (6)
概要
function_refオブジェクトを構築する。
function_refクラステンプレートパラメータのnoexcept例外指定 noex に応じて、説明用のbool型テンプレート定数is-invocable-using<T...>を次のように定義する :
- noex が
trueのとき :is_nothrow_invocable_r_v<R, T..., ArgTypes...> - noex が
falseのとき :is_invocable_r_v<R, T..., ArgTypes...>
function_refオブジェクトは、説明専用のメンバ変数thunk-ptrとbound-entityを保持する。
テンプレートパラメータ制約
function_refクラステンプレートパラメータのCV修飾子 cv に応じて
- (1) :
is_function<F>がtrue、かつis-invocable-using<F>がtrueであること - (2) :
Tをremove_reference_t<F>としたときremove_cvref_t<F>がfunction_refと同一型ではなく、かつis_member_pointer_v<T>がfalseであり、かつis-invocable-using</*cv*/ T&>がtrueであること
- (3) :
Fをdecltype(f)としたときis-invocable-using<F>がtrueであること
- (4) :
Tをremove_reference_t<F>、Fをdecltype(f)としたときis_rvalue_reference_v<U&&>がfalseであり、かつis-invocable-using<F, /*cv*/ T&>がtrueであること
- (5) :
Fをdecltype(f)としたときis-invocable-using<F, /*cv*/ T*>がtrueであること
適格要件
- (3), (4), (5) :
Fをdecltype(f)としたとき、is_pointer<F> || is_member_pointer<F>がtrueならば、fがヌルポインタでないこと。
事前条件
- (1) :
fがヌルポインタでないこと。
効果
function_refクラステンプレートパラメータのCV修飾子 cv に応じて
- (1) :
bound-entityをfで、thunk-ptrを説明専用の関数thunkへのアドレスで初期化する。- 関数呼び出し
thunk(bound-entity, call-args...)はinvoke_r<R>(f, call-args...)と等価。
- 関数呼び出し
- (2) :
bound-entityをaddressof(f)で、thunk-ptrを説明専用の関数thunkへのアドレスで初期化する。- 関数呼び出し
thunk(bound-entity, call-args...)はinvoke_r<R>(static_cast</*cv*/ T&>(f), call-args...)と等価。
- 関数呼び出し
- (3) :
bound-entityを未規定オブジェクトへのポインタまたはヌルポインタで、thunk-ptrを説明専用の関数thunkへのアドレスで初期化する。- 関数呼び出し
thunk(bound-entity, call-args...)はinvoke_r<R>(f, call-args...)と等価。
- 関数呼び出し
- (4) :
bound-entityをaddressof(obj)で、thunk-ptrを説明専用の関数thunkへのアドレスで初期化する。- 関数呼び出し
thunk(bound-entity, call-args...)はinvoke_r<R>(f, static_cast</*cv*/ T&>(obj), call-args...)と等価。
- 関数呼び出し
- (5) :
bound-entityをobjで、thunk-ptrを説明専用の関数thunkへのアドレスで初期化する。- 関数呼び出し
thunk(bound-entity, call-args...)はinvoke_r<R>(f, obj, call-args...)と等価。
- 関数呼び出し
- (6) : コピーコンストラクタ。
例外
投げない
例
#include <functional>
#include <iostream>
#include <utility>
int ident_func(int x)
{ return x; }
struct ident_functor {
int operator()(int x) const
{ return x; }
};
struct X {
int ident_func(int x) const
{ return x; }
};
int main()
{
// (1) 関数ポインタ
{
std::function_ref<int(int)> f1 = &ident_func;
std::cout << "(1) : " << f1(1) << std::endl;
}
// (2) 関数オブジェクト
{
ident_functor functor;
std::function_ref<int(int)> f2 = functor;
std::cout << "(2) : " << f2(2) << std::endl;
}
// (3) メンバ関数
{
std::function_ref<int(X&, int)> f3 = std::nontype<&X::ident>;
X obj;
std::cout << "(3) : " << f3(obj, 3) << std::endl;
}
// (4), (5) メンバ関数+オブジェクト束縛
{
X obj;
std::function_ref<int(int)> f4{std::nontype<&X::ident>, obj};
std::cout << "(4) : " << f4(4) << std::endl;
std::function_ref<int(int)> f5{std::nontype<&X::ident>, &obj};
std::cout << "(5) : " << f5(5) << std::endl;
}
// (6) コピーコンストラクタ
{
std::function_ref<int(int)> f1 = &ident_func;
std::function_ref<int(int)> f6 = f1;
std::cout << "(6) : " << f6(6) << std::endl;
}
}
出力
(1) : 1
(2) : 2
(3) : 3
(4) : 4
(5) : 5
(6) : 6
バージョン
言語
- C++26
処理系
- Clang: ??
- GCC: ??
- ICC: ??
- Visual C++: ??