制作和使用带有无穷大的std::chrono::duration<double>
是否合法是否合法?
std::chrono::duration<double>{ std::numeric_limits<double>::infinity() };
它会像我期望的那样表现,在添加或减去其他持续时间时保持无限值吗?
我已经通过cppreference进行了挖掘,但我发现讨论这个问题的唯一方法是duration_cast
上的页面,注意到:
当浮点值为NaN,无穷大或太大而无法通过目标的整数类型表示时,从浮点持续时间转换为整数持续时间会受到未定义的行为。否则,转换为整数持续时间会受到截断,就像使用static_cast到整数类型一样。
这似乎暗示它是合法的,但只是以一种反面的方式。
(我使用的类型代表“请在X秒内唤醒我”的方式,正无限是一个有用的哨兵,代表“当我醒来时我真的不在乎”)
答案 0 :(得分:14)
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
,{{1}效果为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())
答案 1 :(得分:3)
duration_values
特征为此目的具有max()
值:
std::chrono::duration<double>::max();
不要使用infinity
。如果您将来将此类持续时间转换为基于整数的类型,您最终可能会使用UB。