[libcxx-commits] [PATCH] D130295: [libc++] Uses operator<=> in string_view
Nikolas Klauser via Phabricator via libcxx-commits
libcxx-commits at lists.llvm.org
Sun Jul 24 12:23:15 PDT 2022
philnik added inline comments.
================
Comment at: libcxx/include/string_view:803-810
+_LIBCPP_HIDE_FROM_ABI constexpr auto operator<=>(
+ basic_string_view<_CharT, _Traits> __lhs,
+ typename common_type<basic_string_view<_CharT, _Traits> >::type __rhs) noexcept {
+ if constexpr (requires { typename _Traits::comparison_category; })
+ return static_cast<typename _Traits::comparison_category >(__lhs.compare(__rhs) <=> 0);
+ else
+ return static_cast<weak_ordering>(__lhs.compare(__rhs) <=> 0);
----------------
What breaks if you drop the other two overloads? The compiler should automatically generate the `operator<=>(common_type_t<basic_string_view>, basic_string_view)` IIUC. Or is that just for `operator==`?
================
Comment at: libcxx/include/string_view:805
+ basic_string_view<_CharT, _Traits> __lhs,
+ typename common_type<basic_string_view<_CharT, _Traits> >::type __rhs) noexcept {
+ if constexpr (requires { typename _Traits::comparison_category; })
----------------
jloser wrote:
> Nit: can use `common_type_t` instead - here and elsewhere.
I think this should actually be `type_identity_t`. You could theoretically have something like
```
struct CharT {
// all the stuff to make it char-like
};
struct CharTT {
template <class Traits>
CharTT(std::basic_string_view<CharT, Traits>);
};
template <class Traits>
struct std::common_type<std::basic_string_view<CharT, Traits>, std::basic_string_view<CharT, Traits>> {
using type = CharTT;
};
```
right? That would result in a hard error.
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D130295/new/
https://reviews.llvm.org/D130295
More information about the libcxx-commits
mailing list