像这样,制作和使用无限大的std::chrono::duration<double>作为包含的值是合法的吗?
std::chrono::duration<double>{ std::numeric_limits<double>::infinity() };它的行为会像我预期的那样,在加减其他时间时保持无限的价值吗?
我已经仔细研究了cp偏好,但我发现讨论这个问题的唯一一件事是duration_cast上的页面,指出:
当浮点值为NaN、无穷大或太大而无法用目标的整数类型表示时,从浮点持续时间到整数持续时间的转换会受到未定义的行为的影响。否则,转换为整数持续时间将与任何static_cast转换为整数类型一样受到截断的影响。
这似乎意味着这是合法的,但只是以一种反复无常的方式。
(我用这种类型来表示“请用X秒叫醒我”,而正无穷大是表示“我真的不关心什么时候醒来”的有用哨兵)
发布于 2018-03-28 07:40:10
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 constexpr common_type_t,duration> operator+(const duration& lhs,const duration& 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 };发布于 2018-03-28 07:40:00
为此,duration_values特性具有一个max()值:
std::chrono::duration<double>::max();不要使用infinity。如果您将来碰巧将这样的持续时间转换为基于整数的类型,您可能会以UB结束。
https://stackoverflow.com/questions/49527483
复制相似问题