template <class... ArgTypes>
typename result_of<T&(ArgTypes&&...)>::type operator ()(ArgTypes&&... args) const; //C++11
template <class... ArgTypes>
invoke_result_t<T&, ArgTypes...> operator ()(ArgTypes&&... args) const; //C++17
template <class... ArgTypes>
constexpr invoke_result_t<T&, ArgTypes...>
operator ()(ArgTypes&&... args) const
noexcept(is_nothrow_invocable_v<T&, ArgTypes...>); //C++20
概要
保持している参照に対して関数呼び出しを行う
要件
型Tが関数呼び出し可能な型(Callable)であること。
C++20から、型Tは完全型であること。
戻り値
INVOKE(get(), std::forward<ArgTypes>(args)...)
備考
operator()はreference_wrapperクラスの直接のメンバ関数とする必要は無い(たとえば、基底クラスからの継承など)。
例
#include <iostream>
#include <functional>
struct F {
int operator()(int a, int b) const
{
return a + b;
}
};
int main()
{
F f;
// 関数オブジェクトへの参照を保持する
std::reference_wrapper<F> r(f);
// 保持している関数オブジェクトを呼び出す
int result = r(1, 2);
std::cout << result << std::endl;
}
出力
3
バージョン
言語
- C++11
処理系
- Clang: ??
- GCC: 4.7.0 ✅
- ICC: ??
- Visual C++: ??
参照
- P0357R3 reference_wrapper for incomplete types
- テンプレートパラメータ
Tが完全型であるという要件が追加された経緯
- テンプレートパラメータ
- LWG Issue 3764.
reference_wrapper::operator()should propagatenoexcept- C++23で、
operator()にnoexcept(is_nothrow_invocable_v<T&, ArgTypes...>)が付加され、被参照の呼び出し可能物のnoexcept性が伝播するようになった
- C++23で、