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

### 3741. `std::chrono::abs(duration)` is ill-formed with non-reduced periods

Section: 29.5.10 [time.duration.alg] Status: Tentatively NAD Submitter: Charlie Barto Opened: 2022-07-16 Last modified: 2022-08-24

Priority: Not Prioritized

View all issues with Tentatively NAD status.

Discussion:

Currently 29.5.10 [time.duration.alg] specifies `abs(duration)` as:

> Returns: if `d >= d.zero()`, return `d`, otherwise return `-d`.

Because unary minus on durations is defined to return `common_type_t<duration>(-rep_)`, and `common_type_t` for durations is specified to reduce the period, this is ill-formed with durations such as `duration<int, ratio<1000, 1000>>`, or any other type where the numerator and denominator of the period are not coprime.

[2022-08-23; Reflector poll: NAD]

Not ill-formed, implementation should do a conversion. Changing it to return the reduced duration as an improvement would be for LEWG.

Proposed resolution:

This wording is relative to N4910.

1. Modify 29.2 [time.syn], header `<chrono>` synopsis, as indicated:

   >     […]
   >     // 29.5.10 [time.duration.alg], specialized algorithms
   >     template<class Rep, class Period>
   >       constexpr common_type_t<duration<Rep, Period>> abs(duration<Rep, Period> d);
   >     […]

2. Modify 29.5.10 [time.duration.alg] as indicated:

   > [Drafting note: This will cause `abs` to reduce the period before returning it, much like the other arithmetic operators.

   > This is not a breaking change, because code that was using `abs` with a non-reduced period before did not compile. ]

   >     template<class Rep, class Period>
   >       constexpr common_type_t<duration<Rep, Period>> abs(duration<Rep, Period> d);

   > > -1- Constraints: `numeric_limits<Rep>::is_signed` is `true`.

   > > -2- Returns: If `d >= d.zero()`, return `+d`, otherwise return `-d`.