Skip to content

Commit 24dc20b

Browse files
committed
1 parent ca199a8 commit 24dc20b

File tree

1 file changed

+29
-13
lines changed

1 file changed

+29
-13
lines changed

libcxx/include/__functional/reference_wrapper.h

Lines changed: 29 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -72,36 +72,52 @@ class _LIBCPP_TEMPLATE_VIS reference_wrapper : public __weak_result_type<_Tp> {
7272

7373
// [refwrap.comparisons], comparisons
7474

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+
{
7880
return __x.get() == __y.get();
7981
}
8082

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+
{
8488
return __x.get() == __y;
8589
}
8690

8791
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+
}
8995
{
90-
static_assert(is_convertible_v<decltype(__x.get() == __y.get()), bool>);
91-
9296
return __x.get() == __y.get();
9397
}
9498

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+
{
96106
return std::__synth_three_way(__x.get(), __y.get());
97107
}
98108

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+
{
100114
return std::__synth_three_way(__x.get(), __y);
101115
}
102116

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+
}
105121
{
106122
return std::__synth_three_way(__x.get(), __y.get());
107123
}

0 commit comments

Comments
 (0)