22 General utilities library [utilities]
22.10.6 Class template reference_wrapper [refwrap]
namespace std {
template<class T>
constexpr bool is-ref-wrapper = false;
template<class T>
constexpr bool is-ref-wrapper<reference_wrapper<T>> = true;
template<class R, class T, class RQ, class TQ>
concept ref-wrap-common-reference-exists-with =
is-ref-wrapper<R> &&
requires { typename common_reference_t<typename R::type&, TQ>; } &&
convertible_to<RQ, common_reference_t<typename R::type&, TQ>>;
template<class R, class T, template<class> class RQual, template<class> class TQual>
requires (ref-wrap-common-reference-exists-with<R, T, RQual<R>, TQual<T>> &&
!ref-wrap-common-reference-exists-with<T, R, TQual<T>, RQual<R>>)
struct basic_common_reference<R, T, RQual, TQual> {
using type = common_reference_t<typename R::type&, TQual<T>>;
};
template<class T, class R, template<class> class TQual, template<class> class RQual>
requires (ref-wrap-common-reference-exists-with<R, T, RQual<R>, TQual<T>> &&
!ref-wrap-common-reference-exists-with<T, R, TQual<T>, RQual<R>>)
struct basic_common_reference<T, R, TQual, RQual> {
using type = common_reference_t<typename R::type&, TQual<T>>;
};
}