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::duration并double明确允许(per [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>.Run Code Online (Sandbox Code Playgroud)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 };
Run Code Online (Sandbox Code Playgroud)
该duration_valuestrait 具有max()用于该目的的价值:
std::chrono::duration<double>::max();
Run Code Online (Sandbox Code Playgroud)
不要使用infinity. 如果您将来碰巧将此类持续时间转换为基于整数的类型,则最终可以使用 UB。
| 归档时间: |
|
| 查看次数: |
1876 次 |
| 最近记录: |