basic_format_arg
mis-handles basic_string_view
with custom traitsSection: 28.5.8.1 [format.arg] Status: C++23 Submitter: Casey Carter Opened: 2021-04-20 Last modified: 2023-11-22
Priority: Not Prioritized
View all other issues in [format.arg].
View all issues with C++23 status.
Discussion:
basic_format_arg
has a constructor that accepts a basic_string_view
of an appropriate character type,
with any traits
type. The constructor is specified in 28.5.8.1 [format.arg] as:
template<class traits> explicit basic_format_arg(basic_string_view<char_type, traits> s) noexcept;-9- Effects: Initializes
value
withs
.
Recall that value
is a variant<monostate, bool, char_type, int, unsigned int, long long int,
unsigned long long int, float, double, long double, const char_type*, basic_string_view<char_type>, const void*, handle>
as specified earlier in the subclause. Since basic_string_view<meow, woof>
cannot be
initialized with an lvalue basic_string_view<meow, quack>
— and certainly none
of the other alternative types can be initialized by such an lvalue — the effects of this constructor are
ill-formed when traits
is not std::char_traits<char_type>
.
basic_string
constructor deals with this same issue by ignoring the deduced traits type when initializing
value
's basic_string_view
member:
template<class traits, class Allocator> explicit basic_format_arg( const basic_string<char_type, traits, Allocator>& s) noexcept;-10- Effects: Initializes
value
withbasic_string_view<char_type>(s.data(), s.size())
.
which immediately begs the question of "why doesn't the basic_string_view
constructor do the same?"
[2021-05-10; Reflector poll]
Set status to Tentatively Ready after eight votes in favour during reflector poll.
[2021-06-07 Approved at June 2021 virtual plenary. Status changed: Voting → WP.]
Proposed resolution:
This wording is relative to N4885.
Modify 28.5.8.1 [format.arg] as indicated:
template<class traits> explicit basic_format_arg(basic_string_view<char_type, traits> s) noexcept;-9- Effects: Initializes
value
with.
sbasic_string_view<char_type>(s.data(), s.size())