@@ -293,20 +293,15 @@ concept HasOperatorGreaterThanEqual = requires(T1 t1, T2 t2) { t1 >= t2; };
293293template <typename T1, typename T2 = T1>
294294concept HasOperatorSpaceship = requires (T1 t1, T2 t2) { t1 <=> t2; };
295295
296- template <typename T1, typename T2 = T1>
297- concept CanCompareWithSpaceship = HasOperatorSpaceship<T1, T2> && requires (T1 t1, T2 t2) {
298- { t1 <=> t2 } -> std::same_as<std::strong_ordering>;
299- };
300-
301- template <typename T1, typename T2 = T1>
302- concept CanCompare =
303- HasOperatorEqual<T1, T2> && HasOperatorNotEqual<T1, T2> && HasOperatorLessThan<T1, T2> &&
304- HasOperatorGreaterThan<T1, T2> && HasOperatorLessThanEqual<T1, T2> && HasOperatorGreaterThanEqual<T1, T2>;
305-
306296struct NonComparable {};
307-
308297static_assert (!std::equality_comparable<NonComparable>);
309- static_assert (!CanCompare<NonComparable>);
298+ static_assert (!HasOperatorEqual<NonComparable>);
299+ static_assert (!HasOperatorNotEqual<NonComparable>);
300+ static_assert (!HasOperatorLessThan<NonComparable>);
301+ static_assert (!HasOperatorGreaterThan<NonComparable>);
302+ static_assert (!HasOperatorLessThanEqual<NonComparable>);
303+ static_assert (!HasOperatorGreaterThanEqual<NonComparable>);
304+ static_assert (!HasOperatorSpaceship<NonComparable>);
310305
311306class EqualityComparable {
312307public:
@@ -318,26 +313,29 @@ class EqualityComparable {
318313 int value_;
319314};
320315static_assert (std::equality_comparable<EqualityComparable>);
316+ static_assert (HasOperatorEqual<EqualityComparable>);
317+ static_assert (HasOperatorNotEqual<EqualityComparable>);
321318
322319class ThreeWayComparable {
323320public:
324321 constexpr ThreeWayComparable (int value) : value_{value} {};
325322
326- friend constexpr std::strong_ordering operator <=>(const ThreeWayComparable&, const ThreeWayComparable&) noexcept = default ;
327323 friend constexpr bool operator ==(const ThreeWayComparable&, const ThreeWayComparable&) noexcept = default ;
324+ friend constexpr std::strong_ordering
325+ operator <=>(const ThreeWayComparable&, const ThreeWayComparable&) noexcept = default ;
326+
328327private:
329328 int value_;
330329};
331330static_assert (std::equality_comparable<ThreeWayComparable>);
331+ static_assert (std::three_way_comparable<ThreeWayComparable>);
332332static_assert (HasOperatorEqual<ThreeWayComparable>);
333333static_assert (HasOperatorNotEqual<ThreeWayComparable>);
334334static_assert (HasOperatorLessThan<ThreeWayComparable>);
335335static_assert (HasOperatorGreaterThan<ThreeWayComparable>);
336336static_assert (HasOperatorLessThanEqual<ThreeWayComparable>);
337337static_assert (HasOperatorGreaterThanEqual<ThreeWayComparable>);
338338static_assert (HasOperatorSpaceship<ThreeWayComparable>);
339- static_assert (CanCompare<ThreeWayComparable>);
340- static_assert (CanCompareWithSpaceship<ThreeWayComparable>);
341339
342340#endif // TEST_STD_VER >= 26
343341
0 commit comments