Ответ 1
Значение infinity
для std::chrono::duration<double>
будет вести себя так, как вы ожидаете, с помощью арифметических операторов.
std::chrono::duration<double>
отлично
[time.duration] определяет условия, существующие в Rep
для template<class Rep> std::chrono::duration
и double
явно разрешено (за [time.duration]/2), никакое специальное значение не разрешено:
Rep
должен быть арифметическим типом или классом, эмулирующим арифметический тип.
std::numeric_limits<double>::infinity()
отлично работает
[time.duration.arithmetic] и [time.duration.nonmemberdefine] определяют поведение арифметических операторов по duration
. Для каждого operator♦
и заданных двух объектов duration
A
и B
содержащих double
значения a
и b
, A♦B
эффекты как a♦b
будут. Например, для +
:
В последующих описаниях функций
CD
представляет тип возвращаемой функции.CR(A, B)
представляетcommon_type_t<A, B>
.template<class Rep1, class Period1, class Rep2, class Period2> constexpr common_type_t<duration<Rep1, Period1>, duration<Rep2, Period2>> operator+(const duration<Rep1, Period1>& lhs, const duration<Rep2, Period2>& rhs);
Возвраты:
CD(CD(lhs).count() + CD(rhs).count())
.
Это явно означает, что следующее будет вести себя так, как ожидалось:
const double infinity = std::numeric_limits<double>::infinity();
std::chrono::duration<double> inf{ infinity };
std::chrono::duration<double> one{ 1.0 };
inf + one; // as if std::chrono::duration<double>{ infinity + 1.0 };