@@ -72,36 +72,52 @@ 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) {
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 requires (const _Tp t) {
103
+ { t < t } -> __boolean_testable;
104
+ }
105
+ {
96
106
return std::__synth_three_way (__x.get (), __y.get ());
97
107
}
98
108
99
- friend constexpr __synth_three_way_result<_Tp> operator <=>(reference_wrapper __x, const _Tp& __y) {
109
+ friend constexpr auto operator <=>(reference_wrapper __x, const _Tp& __y)
110
+ requires requires (const _Tp t) {
111
+ { t < t } -> __boolean_testable;
112
+ }
113
+ {
100
114
return std::__synth_three_way (__x.get (), __y);
101
115
}
102
116
103
- friend constexpr __synth_three_way_result<_Tp> operator <=>(reference_wrapper __x, reference_wrapper<const _Tp> __y)
104
- requires (!is_const_v<_Tp>)
117
+ friend constexpr auto operator <=>(reference_wrapper __x, reference_wrapper<const _Tp> __y)
118
+ requires (!is_const_v<_Tp>) && requires(const _Tp t) {
119
+ { t < t } -> __boolean_testable;
120
+ }
105
121
{
106
122
return std::__synth_three_way (__x.get (), __y.get ());
107
123
}
0 commit comments