duration
conversion overflow shouldn't participate in overload resolutionSection: 30.5.2 [time.duration.cons] Status: C++14 Submitter: Vicente J. Botet Escriba Opened: 2011-10-31 Last modified: 2016-01-28
Priority: Not Prioritized
View all other issues in [time.duration.cons].
View all issues with C++14 status.
Discussion:
30.5.2 [time.duration.cons] says:
template <class Rep2, class Period2> constexpr duration(const duration<Rep2, Period2>& d);Remarks: This constructor shall not participate in overload resolution unless
treat_as_floating_point<rep>::value
istrue
or bothratio_divide<Period2, period>::den
is1
andtreat_as_floating_point<Rep2>::value
isfalse
.
The evaluation of ratio_divide<Period2, period>::den
could make
ratio_divide<Period2, period>::num
overflow.
period
=ratio<1,1000>
)
from an exa-second (Period2
=ratio<1018>
).
ratio_divide<ratio<1018>, ratio<1,1000>>::num
is
1021
which overflows which makes the compiler error.
If the function f
is overloaded with milliseconds and seconds
void f(milliseconds); void f(seconds);
The following fails to compile.
duration<int,exa> r(1); f(r);
While the conversion to seconds work, the conversion to milliseconds make the program fail at compile time.
In my opinion, this program should be well formed and the constructor from duration<int,exa>
to milliseconds shouldn't participate in overload resolution as the result can not be represented.
[2012, Kona]
Move to Review.
Pete: The wording is not right.
Howard: Will implement this to be sure it works.
Jeffrey: If ratio needs a new hook, should it be exposed to users for their own uses?
Pete: No.
Move to Review, Howard to implement in a way that mere mortals can understand.
[2013-04-18, Bristol]
Proposed resolution:
This wording is relative to the FDIS.
Change the following paragraphs of 30.5.2 [time.duration.cons] p4 indicated:
template <class Rep2, class Period2> constexpr duration(const duration<Rep2, Period2>& d);Remarks: This constructor shall not participate in overload resolution unless no overflow is induced in the conversion and
treat_as_floating_point<rep>::value
istrue
or bothratio_divide<Period2, period>::den
is1
andtreat_as_floating_point<Rep2>::value
isfalse
. [ Note: This requirement prevents implicit truncation error when converting between integral-based duration types. Such a construction could easily lead to confusion about the value of the duration. — end note ]