- functional[meta header]
- std[meta namespace]
- reference_wrapper[meta class]
- function template[meta id-type]
- cpp11[meta cpp]
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- is_nothrow_invocable_v[link /reference/type_traits/is_nothrow_invocable.md]
保持している参照に対して関数呼び出しを行う
型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;
}- r(1, 2)[color ff0000]
3
- C++11
- Clang: ??
- GCC: 4.7.0 [mark verified]
- ICC: ??
- Visual C++: ??
- P0357R3 reference_wrapper for incomplete types
- テンプレートパラメータ
Tが完全型であるという要件が追加された経緯
- テンプレートパラメータ
- LWG Issue 2017.
std::reference_wrappermakes incorrect usage ofstd::result_of - LWG Issue 3764.
reference_wrapper::operator()should propagatenoexcept- C++23で、
operator()にnoexcept(is_nothrow_invocable_v<T&, ArgTypes...>)が付加され、被参照の呼び出し可能物のnoexcept性が伝播するようになった
- C++23で、