13#ifndef RANGES_V3_FUNCTIONAL_REFERENCE_WRAPPER_HPP
14#define RANGES_V3_FUNCTIONAL_REFERENCE_WRAPPER_HPP
24#include <range/v3/utility/addressof.hpp>
25#include <range/v3/utility/static_const.hpp>
27#include <range/v3/detail/prologue.hpp>
38 struct reference_wrapper_
41 constexpr reference_wrapper_() =
default;
42 constexpr reference_wrapper_(T & t) noexcept
43 : t_(detail::addressof(t))
45 constexpr reference_wrapper_(T &&) =
delete;
46 constexpr T & get() const noexcept
52 struct reference_wrapper_<T &> : reference_wrapper_<T>
54 using reference_wrapper_<T>::reference_wrapper_;
57 struct reference_wrapper_<T &&>
60 constexpr reference_wrapper_() =
default;
61 constexpr reference_wrapper_(T && t) noexcept
62 : t_(detail::addressof(t))
64 constexpr T && get() const noexcept
66 return static_cast<T &&
>(*t_);
78 using base_ = detail::reference_wrapper_<T>;
88 constructible_from<base_, U>)
90 std::is_nothrow_constructible<base_, U>::value)
91 : detail::reference_wrapper_<T>{
static_cast<U &&
>(u)}
93 constexpr reference get()
const noexcept
95 return this->base_::get();
97 constexpr operator reference()
const noexcept
101 template(
typename...)(
102 requires (!std::is_rvalue_reference<T>::value))
103 constexpr operator std::reference_wrapper<type>()
const noexcept
108 template<
typename ...Args>
109 constexpr auto CPP_auto_fun(
operator())(Args &&...args) (
const)
111 return invoke(
static_cast<reference
>(*t_),
static_cast<Args &&
>(args)...)
118 template(
typename T)(
119 requires (!is_reference_wrapper_v<T>))
140 RANGES_INLINE_VARIABLE(ref_fn, ref)
143 using ref_t =
decltype(ref(std::declval<T>()));
148 constexpr T && operator()(T && t)
const noexcept
150 return static_cast<T &&
>(t);
161 constexpr T &
operator()(std::reference_wrapper<T> t)
const noexcept
175 RANGES_INLINE_VARIABLE(unwrap_reference_fn, unwrap_reference)
182#include <range/v3/detail/epilogue.hpp>
decltype(unwrap_reference(std::declval< T >())) unwrap_reference_t
Definition reference_wrapper.hpp:178
decltype(ref(std::declval< T >())) ref_t
Definition reference_wrapper.hpp:143
typename T::type _t
Type alias for T::type.
Definition meta.hpp:141
_t< detail::_if_< list< Args... > > > if_
Select one type or another depending on a compile-time Boolean.
Definition meta.hpp:1247
Definition reference_wrapper.hpp:117
constexpr reference_wrapper< T > operator()(reference_wrapper< T > t) const
This is an overloaded member function, provided for convenience. It differs from the above function o...
Definition reference_wrapper.hpp:126
constexpr reference_wrapper< T > operator()(std::reference_wrapper< T > t) const
This is an overloaded member function, provided for convenience. It differs from the above function o...
Definition reference_wrapper.hpp:132
Definition reference_wrapper.hpp:76
Definition reference_wrapper.hpp:146
constexpr reference_wrapper< T >::reference operator()(reference_wrapper< T > t) const noexcept
This is an overloaded member function, provided for convenience. It differs from the above function o...
Definition reference_wrapper.hpp:154
constexpr T & operator()(ref_view< T > t) const noexcept
This is an overloaded member function, provided for convenience. It differs from the above function o...
Definition reference_wrapper.hpp:167
constexpr T & operator()(std::reference_wrapper< T > t) const noexcept
This is an overloaded member function, provided for convenience. It differs from the above function o...
Definition reference_wrapper.hpp:161