[libcxx-commits] [PATCH] D80891: [libcxx] adds operator<=> for basic_string_view

Christopher Di Bella via Phabricator via libcxx-commits libcxx-commits at lists.llvm.org
Mon Jun 1 08:33:52 PDT 2020


cjdb added a comment.

Thanks @miscco!



================
Comment at: libcxx/include/__string:61
 
+#if __cplusplus > 201703L && defined(__cpp_impl_three_way_comparison) && __cpp_impl_three_way_comparison >= 201907
+#include <compare>
----------------
miscco wrote:
> I would suggest to create define like the other we usually find, e.g `_LIBCPP_STRING_HAS_NO_SPACESHIP_OPERATOR` (Note that they are usually negated)
> 
> Then these could all be turned into 
> `#ifndef _LIBCPP_STRING_HAS_NO_SPACESHIP_OPERATOR`
Ack, I forgot to clean this one up. What's the advantage of `_LIBCPP_STRING_HAS_NO_SPACESHIP_OPERATOR` over `_LIBCPP_HAS_NO_SPACESHIP_OPERATOR`?


================
Comment at: libcxx/include/compare:250
 
+  friend constexpr bool operator==(partial_ordering, partial_ordering) noexcept = default;
+
----------------
miscco wrote:
> I guess this is missing `_LIBCPP_INLINE_VISIBILITY `
Does it need that? We've defined it here, so it should //already// have inline visibility.


================
Comment at: libcxx/include/string_view:783
+    const auto result = __lhs.compare(__rhs) <=> 0;
+    if constexpr (requires { typename _Traits::comparison_category; }) {
+        return static_cast<typename _Traits::comparison_category>(result);
----------------
miscco wrote:
> Out of curriosity. Do you have a working example where `result` `would *not* be the right comparison category?
For a live example, see lines 64-79 in the test case below.

I guess the reason it was designed this way is for backwards compatibility. Someone who designed their char_traits specialisation 20 years ago shouldn't be penalised for not having this trait.


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D80891/new/

https://reviews.llvm.org/D80891





More information about the libcxx-commits mailing list