Section: 30.12 [time.format] Status: C++23 Submitter: Jonathan Wakely Opened: 2022-12-14 Last modified: 2024-01-29
Priority: Not Prioritized
View other active issues in [time.format].
View all other issues in [time.format].
View all issues with C++23 status.
Discussion:
30.12 [time.format] says:
[…] Giving a precision specification in the chrono-format-spec is valid only for
std::chrono::durationtypes where the representation typeRepis a floating-point type. For all otherReptypes, an exception of typeformat_erroris thrown if the chrono-format-spec contains a precision specification. […]
It's unclear whether the restriction in the first sentence applies to all types, or only duration types.
The second sentence seems to restrict the exceptional case to only types with a non-floating-point Rep,
but what about types with no Rep type at all?
sys_time<duration<float>>? That is not a duration type at all,
so does the restriction apply? What about hh_mm_ss<duration<int>>? That's not a
duration type, but it uses one, and its Rep is not a floating-point type.
What about sys_info? That's not a duration and doesn't have any associated duration,
or Rep type.
What is the intention here?
Less importantly, I don't like the use of Rep here. That's the template parameter of the
duration class template, but that name isn't in scope here. Why aren't we talking about the
duration type's rep type, which is the public name for it? Or about a concrete
specialization duration<Rep, Period>, instead of the class template?
The suggested change below would preserve the intended meaning, but with more … precision.
[2023-01-06; Reflector poll]
Set status to Tentatively Ready after eight votes in favour during reflector poll.
[2023-02-13 Approved at February 2023 meeting in Issaquah. Status changed: Voting → WP.]
Proposed resolution:
This wording is relative to N4917.
Modify 30.12 [time.format] as indicated:
-1- […]
The productions fill-and-align, width, and precision are described in 28.5.2 [format.string]. Giving a precision specification in the chrono-format-spec is valid only for types that are specializations ofstd::chrono::durationtypes where the representation typefor which the nested typedef-nameRepisrepdenotes a floating-point type. For all othertypes, an exception of typeRepformat_erroris thrown if the chrono-format-spec contains a precision specification. […]