namespace std {
template<class T> class reference_wrapper {
public:
// types
using type = T;
// construct/copy/destroy
template<class U>
reference_wrapper(U&&) noexcept(see below);
reference_wrapper(const reference_wrapper& x) noexcept;
// assignment
reference_wrapper& operator=(const reference_wrapper& x) noexcept;
// access
operator T& () const noexcept;
T& get() const noexcept;
// invocation
template<class... ArgTypes>
invoke_result_t<T&, ArgTypes...> operator()(ArgTypes&&...) const;
};
template<class T>
reference_wrapper(T&) -> reference_wrapper<T>;
}template<class U>
reference_wrapper(U&& u) noexcept(see below);
void FUN(T&) noexcept; void FUN(T&&) = delete;This constructor shall not participate in overload resolution unless the expression FUN(declval<U>()) is well-formed and is_same_v<remove_cvref_t<U>, reference_wrapper> is false.
reference_wrapper(const reference_wrapper& x) noexcept;
reference_wrapper& operator=(const reference_wrapper& x) noexcept;
operator T& () const noexcept;
T& get() const noexcept;
template<class... ArgTypes>
invoke_result_t<T&, ArgTypes...>
operator()(ArgTypes&&... args) const;
template<class T> reference_wrapper<T> ref(T& t) noexcept;
template<class T> reference_wrapper<T> ref(reference_wrapper<T> t) noexcept;
template<class T> reference_wrapper<const T> cref(const T& t) noexcept;
template<class T> reference_wrapper<const T> cref(reference_wrapper<T> t) noexcept;