|
10453 | 10453 | template<class T>
|
10454 | 10454 | constexpr reference_wrapper<const T> cref(reference_wrapper<T>) noexcept; // freestanding
|
10455 | 10455 |
|
| 10456 | + // \ref{refwrap.common.ref}, \tcode{common_reference} related specializations |
| 10457 | + template<class R, class T, template<class> class RQual, template<class> class TQual> |
| 10458 | + requires @\seebelow@ |
| 10459 | + struct basic_common_reference<R, T, RQual, TQual>; |
| 10460 | + |
| 10461 | + template<class T, class R, template<class> class TQual, template<class> class RQual> |
| 10462 | + requires @\seebelow@ |
| 10463 | + struct basic_common_reference<T, R, TQual, RQual>; |
| 10464 | + |
10456 | 10465 | // \ref{arithmetic.operations}, arithmetic operations
|
10457 | 10466 | template<class T = void> struct plus; // freestanding
|
10458 | 10467 | template<class T = void> struct minus; // freestanding
|
|
11004 | 11013 | \tcode{t}.
|
11005 | 11014 | \end{itemdescr}
|
11006 | 11015 |
|
| 11016 | +\rSec3[refwrap.common.ref]{\tcode{common_reference} related specializations} |
| 11017 | + |
| 11018 | +\indexlibraryglobal{basic_common_reference}% |
| 11019 | +\begin{codeblock} |
| 11020 | +namespace std { |
| 11021 | + template<class T> |
| 11022 | + constexpr bool @\exposid{is-ref-wrapper}@ = false; // \expos |
| 11023 | + |
| 11024 | + template<class T> |
| 11025 | + constexpr bool @\exposid{is-ref-wrapper}@<reference_wrapper<T>> = true; |
| 11026 | + |
| 11027 | + template<class R, class T, class RQ, class TQ> |
| 11028 | + concept @\defexposconcept{ref-wrap-common-reference-exists-with}@ = // \expos |
| 11029 | + @\exposid{is-ref-wrapper}@<R> && |
| 11030 | + requires { typename common_reference_t<typename R::type&, TQ>; } && |
| 11031 | + @\libconcept{convertible_to}@<RQ, common_reference_t<typename R::type&, TQ>>; |
| 11032 | + |
| 11033 | + template<class R, class T, template<class> class RQual, template<class> class TQual> |
| 11034 | + requires (@\exposconcept{ref-wrap-common-reference-exists-with}@<R, T, RQual<R>, TQual<T>> && |
| 11035 | + !@\exposconcept{ref-wrap-common-reference-exists-with}@<T, R, TQual<T>, RQual<R>>) |
| 11036 | + struct basic_common_reference<R, T, RQual, TQual> { |
| 11037 | + using type = common_reference_t<typename R::type&, TQual<T>>; |
| 11038 | + }; |
| 11039 | + |
| 11040 | + template<class T, class R, template<class> class TQual, template<class> class RQual> |
| 11041 | + requires (@\exposconcept{ref-wrap-common-reference-exists-with}@<R, T, RQual<R>, TQual<T>> && |
| 11042 | + !@\exposconcept{ref-wrap-common-reference-exists-with}@<T, R, TQual<T>, RQual<R>>) |
| 11043 | + struct basic_common_reference<T, R, TQual, RQual> { |
| 11044 | + using type = common_reference_t<typename R::type&, TQual<T>>; |
| 11045 | + }; |
| 11046 | +} |
| 11047 | +\end{codeblock} |
| 11048 | + |
11007 | 11049 | \rSec2[arithmetic.operations]{Arithmetic operations}
|
11008 | 11050 |
|
11009 | 11051 | \rSec3[arithmetic.operations.general]{General}
|
|
0 commit comments