This page is a snapshot from the LWG issues list, see the Library Active Issues List for more information and the meaning of Resolved status.
Section: 21.4.4 [ratio.arithmetic] Status: Resolved Submitter: BSI Opened: 2010-08-25 Last modified: 2016-01-28
Priority: Not Prioritized
View all other issues in [ratio.arithmetic].
View all issues with Resolved status.
Discussion:
Addresses GB-89
The alias representations of the ratio arithmetic templates do not allow implementations to avoid overflow, since they explicitly specify the form of the aliased template instantiation. For example ratio_multiply, ratio<2, LLONG_MAX> is required to alias ratio<2*LLONG_MAX, LLONG_MAX*2>, which overflows, so is ill-formed. However, this is trivially equal to ratio<1, 1>. It also contradicts the opening statement of 21.4.4 [ratio.arithmetic] p. 1 "implementations may use other algorithms to compute these values".
[ 2010-10-25 Daniel adds: ]
Accepting n3131 would solve this issue.
[Batavia: Resolved by accepting n3210.]
Proposed resolution:
Change the wording in 21.4.4 [ratio.arithmetic] p. 2-5 as follows:
template <class R1, class R2> using ratio_add = see below;2 The type ratio_add<R1, R2> shall be a synonym for
ratio<T1, T2>ratio<U, V> such that ratio<U, V>::num and ratio<U, V>::den are the same as the corresponding members of ratio<T1, T2> would be in the absence of arithmetic overflow where T1 has the value R1::num * R2::den + R2::num * R1::den and T2 has the value R1::den * R2::den. If the required values of ratio<U, V>::num and ratio<U, V>::den cannot be represented in intmax_t then the program is ill-formed.
template <class R1, class R2> using ratio_subtract = see below;3 The type ratio_subtract<R1, R2> shall be a synonym for
ratio<T1, T2>ratio<U, V> such that ratio<U, V>::num and ratio<U, V>::den are the same as the corresponding members of ratio<T1, T2> would be in the absence of arithmetic overflow where T1 has the value R1::num * R2::den - R2::num * R1::den and T2 has the value R1::den * R2::den. If the required values of ratio<U, V>::num and ratio<U, V>::den cannot be represented in intmax_t then the program is ill-formed.
template <class R1, class R2> using ratio_multiply = see below;4 The type ratio_multiply<R1, R2> shall be a synonym for
ratio<T1, T2>ratio<U, V> such that ratio<U, V>::num and ratio<U, V>::den are the same as the corresponding members of ratio<T1, T2> would be in the absence of arithmetic overflow where T1 has the value R1::num * R2::num and T2 has the value R1::den * R2::den. If the required values of ratio<U, V>::num and ratio<U, V>::den cannot be represented in intmax_t then the program is ill-formed.
template <class R1, class R2> using ratio_divide = see below;5 The type ratio_divide<R1, R2> shall be a synonym for
ratio<T1, T2>ratio<U, V> such that ratio<U, V>::num and ratio<U, V>::den are the same as the corresponding members of ratio<T1, T2> would be in the absence of arithmetic overflow where T1 has the value R1::num * R2::den and T2 has the value R1::den * R2::num. If the required values of ratio<U, V>::num and ratio<U, V>::den cannot be represented in intmax_t then the program is ill-formed.