@@ -72,36 +72,50 @@ class _LIBCPP_TEMPLATE_VIS reference_wrapper : public __weak_result_type<_Tp> {
72
72
73
73
// [refwrap.comparisons], comparisons
74
74
75
- friend constexpr bool operator ==(reference_wrapper __x, reference_wrapper __y) {
76
- static_assert (is_convertible_v<decltype (__x.get () == __y.get ()), bool >);
77
-
75
+ friend constexpr bool operator ==(reference_wrapper __x, reference_wrapper __y)
76
+ requires requires {
77
+ { __x.get () == __y.get () } -> __boolean_testable;
78
+ }
79
+ {
78
80
return __x.get () == __y.get ();
79
81
}
80
82
81
- friend constexpr bool operator ==(reference_wrapper __x, const _Tp& __y) {
82
- static_assert (is_convertible_v<decltype (__x.get () == __y), bool >);
83
-
83
+ friend constexpr bool operator ==(reference_wrapper __x, const _Tp& __y)
84
+ requires requires {
85
+ { __x.get () == __y } -> __boolean_testable;
86
+ }
87
+ {
84
88
return __x.get () == __y;
85
89
}
86
90
87
91
friend constexpr bool operator ==(reference_wrapper __x, reference_wrapper<const _Tp> __y)
88
- requires (!is_const_v<_Tp>)
92
+ requires (!is_const_v<_Tp>) && requires {
93
+ { __x.get () == __y.get () } -> __boolean_testable;
94
+ }
89
95
{
90
- static_assert (is_convertible_v<decltype (__x.get () == __y.get ()), bool >);
91
-
92
96
return __x.get () == __y.get ();
93
97
}
94
98
95
- friend constexpr __synth_three_way_result<_Tp> operator <=>(reference_wrapper __x, reference_wrapper __y) {
96
- return std::__synth_three_way (__x.get (), __y.get ());
99
+ // `operator<=>`: Checks the constraints of `synth-three-way` as per https://wg21.link/LWG4071 directly
100
+
101
+ friend constexpr auto operator <=>(reference_wrapper __x, reference_wrapper __y)
102
+ requires (_Tp t)
103
+ {
104
+ { t < t } -> __boolean_testable;
97
105
}
106
+ { return std::__synth_three_way (__x.get (), __y.get ()); }
98
107
99
- friend constexpr __synth_three_way_result<_Tp> operator <=>(reference_wrapper __x, const _Tp& __y) {
100
- return std::__synth_three_way (__x.get (), __y);
108
+ friend constexpr auto operator <=>(reference_wrapper __x, const _Tp& __y)
109
+ requires (_Tp t)
110
+ {
111
+ { t < t } -> __boolean_testable;
101
112
}
113
+ { return std::__synth_three_way (__x.get (), __y); }
102
114
103
- friend constexpr __synth_three_way_result<_Tp> operator <=>(reference_wrapper __x, reference_wrapper<const _Tp> __y)
104
- requires (!is_const_v<_Tp>)
115
+ friend constexpr auto operator <=>(reference_wrapper __x, reference_wrapper<const _Tp> __y)
116
+ requires (!is_const_v<_Tp>) && requires(_Tp t) {
117
+ { t < t } -> __boolean_testable;
118
+ }
105
119
{
106
120
return std::__synth_three_way (__x.get (), __y.get ());
107
121
}
0 commit comments