This page is a snapshot from the LWG issues list, see the Library Active Issues List for more information and the meaning of WP status.

### 3619. Specification of `vformat_to` contains ill-formed `formatted_size` calls

Section: 20.20.5 [format.functions] Status: WP Submitter: Tim Song Opened: 2021-10-17 Last modified: 2022-02-10

Priority: Not Prioritized

View all other issues in [format.functions].

View all issues with WP status.

Discussion:

The specification of `vformat_to` says that it formats "into the range `[out, out + N)`, where `N` is `formatted_size(fmt, args...)` for the functions without a `loc` parameter and `formatted_size(loc, fmt, args...)` for the functions with a `loc` parameter".

This is wrong in at least two ways:

- First, `args` is a `(w)format_args`, not a pack, so it doesn't make sense to use `...` to expand it.

- Second, `fmt` is a `(w)string_view` parameter, and it is never a constant expression, and so the call is ill-formed after P2216 added compile-time format string checking.

[2022-01-29; Reflector poll]

Set status to Tentatively Ready after six votes in favour during reflector poll.

[2022-02-10 Approved at February 2022 virtual plenary. Status changed: Tentatively Ready → WP.]

Proposed resolution:

This wording is relative to N4892.

1. Modify 20.20.5 [format.functions] as indicated:

   >     template<class Out>
   >       Out vformat_to(Out out, string_view fmt, format_args args);
   >     template<class Out>
   >       Out vformat_to(Out out, wstring_view fmt, wformat_args args);
   >     template<class Out>
   >       Out vformat_to(Out out, const locale& loc, string_view fmt, format_args args);
   >     template<class Out>
   >       Out vformat_to(Out out, const locale& loc, wstring_view fmt, wformat_args args);

   > > -12- Let `charT` be `decltype(fmt)::value_type`.

   > > -13- Constraints: `Out` satisfies `output_iterator<const charT&>`.

   > > -14- Preconditions: `Out` models `output_iterator<const charT&>`.

   > > -15- Effects: Places the character representation of formatting the arguments provided by `args`, formatted according to the specifications given in `fmt`, into the range `[out, out + N)`, where `N` is `formatted_size(fmt, args...)` for the functions without a `loc` parameter and `formatted_size(loc, fmt, args...)` for the functions with a `loc` parameter the number of characters in that character representation. If present, `loc` is used for locale-specific formatting.

   > > -16- Returns: `out + N`.

   > > -17- […]