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

Jam*_*one 26 c++ language-lawyer c++11 c++-chrono

制作和使用std::chrono::duration<double>无穷大作为包含值是否合法?

std::chrono::duration<double>{ std::numeric_limits<double>::infinity() };
Run Code Online (Sandbox Code Playgroud)

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

我通过cppreference挖了但是我发现讨论这个问题的唯一一件事就是duration_cast注意到这一点的页面:

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

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

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

YSC*_*YSC 14

infinityfor 的值std::chrono::duration<double>将按照您对算术运算符的预期运行.

std::chrono::duration<double> 很好

[time.duration]定义Repfor上存在的条件template<class Rep> std::chrono::durationdouble明确允许(per [time.duration]/2),不允许特殊值:

Rep 应为算术类型或模拟算术类型的类.

std::numeric_limits<double>::infinity() 很好

[time.duration.arithmetic][time.duration.nonmemberdefine]定义算术运算符的行为duration.对于每个operator?并给出了两个duration对象AB持有double价值ab,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);
Run Code Online (Sandbox Code Playgroud)

返回: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 };
Run Code Online (Sandbox Code Playgroud)


rus*_*tyx 5

duration_valuestrait 具有max()用于该目的的价值:

    std::chrono::duration<double>::max();
Run Code Online (Sandbox Code Playgroud)

不要使用infinity. 如果您将来碰巧将此类持续时间转换为基于整数的类型,则最终可以使用 UB。

  • `std::chrono::duration&lt;double&gt;::max()` 确实没有合适的属性来充当(方便的)哨兵;无穷大的使用允许对返回值添加/减去一些值,而不会使其不再是哨兵值。 (3认同)
  • 我认为 inf 与 max 的行为不同的地方是如果 period(持续时间的第二个操作数)不 = 1。当然,很自然地只使用 1(秒)和 double,但可以定义一天的时间段,或微秒。当您在不同周期的双持续时间之间进行转换时,值 max() ***将不会被保留***,而值 inf 将被保留,并可用于以后的比较。 (2认同)