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.

### 3462. §[formatter.requirements]: Formatter requirements forbid use of `fc.arg()`

Section: 22.14.6.1 [formatter.requirements] Status: WP Submitter: Alberto Barbati Opened: 2020-06-30 Last modified: 2021-06-07

Priority: 3

View all other issues in [formatter.requirements].

View all issues with WP status.

Discussion:

The requirements on the expression `f.format(t, fc)` in [tab:formatter] say

> Formats `t` according to the specifiers stored in `*this`, writes the output to `fc.out()` and returns an iterator past the end of the output range. The output shall only depend on `t`, `fc.locale()`, and the range `[pc.begin(), pc.end())` from the last call to `f.parse(pc)`.

Strictly speaking, this wording effectively forbids `f.format(t, fc)` from calling `fc.arg(n)`, whose motivation is precisely to allow a formatter to rely on arguments different from `t`. According to this interpretation, there's no conforming way to implement the `"{ arg-id }"` form of the width and precision fields of standard format specifiers. Moreover, the formatter described in the example if paragraph 22.14.6.6 [format.context]/8 would also be non-conforming.

[2020-07-12; Reflector prioritization]

Set priority to 3 after reflector discussions.

Previous resolution [SUPERSEDED]:

> This wording is relative to N4861.

> 1. Modify 22.14.6.1 [formatter.requirements], Table [tab:formatter], as indicated:

>    > Table 67: Formatter requirements [tab:formatter]
>    > Expression | Return type | Requirement
>    > --- | --- | ---
>    > `…`
>    > `f.format(t, fc)` | `FC::iterator` | Formats `t` according to the specifiers stored in `*this`, writes the output to `fc.out()` and returns an iterator past the end of the output range. The output shall only depend on `t`, `fc.locale()`, and the range `[pc.begin(), pc.end())` from the last call to `f.parse(pc)`, and `fc.arg(n)`, where `n` is a `size_t` index value that has been validated with a call to `pc.check_arg_id(n)` in the last call to `f.parse(pc)`.
>    > `…`

[2021-05-20 Tim comments and updates wording]

During reflector discussion Victor said that the formatter requirements should allow dependency on any of the format arguments in the context. The wording below reflects that.

[2021-05-24; Reflector poll]

Set status to Tentatively Ready after six 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.

1. Modify 22.14.6.1 [formatter.requirements], Table [tab:formatter], as indicated:

   > Table 67: Formatter requirements [tab:formatter]
   > Expression | Return type | Requirement
   > --- | --- | ---
   > `…`
   > `f.format(t, fc)` | `FC::iterator` | Formats `t` according to the specifiers stored in `*this`, writes the output to `fc.out()` and returns an iterator past the end of the output range. The output shall only depend on `t`, `fc.locale()`, `fc.arg(n)` for any value `n` of type `size_t`, and the range `[pc.begin(), pc.end())` from the last call to `f.parse(pc)`.
   > `…`