[libcxx-commits] [PATCH] D113161: [libc++] Implement P1989R2: range constructor for string_view
Joe Loser via Phabricator via libcxx-commits
libcxx-commits at lists.llvm.org
Wed Nov 10 09:28:45 PST 2021
jloser marked 2 inline comments as done.
jloser added inline comments.
================
Comment at: libcxx/test/std/strings/string.view/string.view.cons/from_range.pass.cpp:115
+
+static_assert(!std::is_constructible_v<std::string_view, WithTraitsType<std::char_traits<char16_t>>>); // wrong traits_type
+
----------------
Quuxplusone wrote:
> jloser wrote:
> > Quuxplusone wrote:
> > > Either make `WithTraitsType` a non-template, or use its templateyness to prove that `string_view` //is// constructible with the //correct// traits type:
> > > ```
> > > #include "constexpr_char_traits.h" // We have no "really weird char traits" helper header? Darn.
> > > using CCT = constexpr_char_traits<char>;
> > > static_assert(std::is_constructible_v<std::string_view, WithTraitsType<std::char_traits<char>>>);
> > > static_assert(std::is_constructible_v<std::wstring_view, WithTraitsType<std::char_traits<wchar_t>>>);
> > > static_assert(std::is_constructible_v<std::basic_string_view<char, CCT>, WithTraitsType<CCT>>);
> > > static_assert(!std::is_constructible_v<std::string_view, WithTraitsType<CCT>>); // wrong traits type
> > > static_assert(!std::is_constructible_v<std::wstring_view, WithTraitsType<std::char_traits<char>>>); // wrong traits type
> > > ```
> > > Here I'm also drive-by testing that we're looking at the whole traits type, not just its character type.
> > I like that idea -- it actually caught a bug in our implementation since I was comparing the `traits_type` with `_Char` and not `_Traits`!. Still need to figure out why our implementation is rejecting
> >
> > ```
> > static_assert(std::is_constructible_v<std::wstring_view, WithTraitsType<std::char_traits<wchar_t>>>);
> > ```
> That'll be because if you're keeping `WithTraitsType` as a template, then you must make it respect its traits type in `begin` and `end`.
> ```
> template<class CharTraits>
> struct WithTraitsType {
> typename CharTraits::char_type *begin() const;
> typename CharTraits::char_type *end() const;
> using traits_type = CharTraits;
> };
> ```
> should fix it.
Right, that's it. That skipped right past my brain this morning before coffee. :)
I left the `CharTraits` as a template.
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D113161/new/
https://reviews.llvm.org/D113161
More information about the libcxx-commits
mailing list