无限的std :: chrono :: duration对象是否合法?

时间:2018-03-28 06:24:25

标签: c++ c++11 language-lawyer chrono

制作和使用带有无穷大的std::chrono::duration<double>是否合法是否合法?

std::chrono::duration<double>{ std::numeric_limits<double>::infinity() };

它会像我期望的那样表现,在添加或减去其他持续时间时保持无限值吗?

我已经通过cppreference进行了挖掘,但我发现讨论这个问题的唯一方法是duration_cast上的页面,注意到:

  

当浮点值为NaN,无穷大或太大而无法通过目标的整数类型表示时,从浮点持续时间转换为整数持续时间会受到未定义的行为。否则,转换为整数持续时间会受到截断,就像使用static_cast到整数类型一样。

这似乎暗示它是合法的,但只是以一种反面的方式。

(我使用的类型代表“请在X秒内唤醒我”的方式,正无限是一个有用的哨兵,代表“当我醒来时我真的不在乎”)

2 个答案:

答案 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对象AB,其中包含doubleab,{{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。