首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >无限的std::legal::工期对象合法吗?

无限的std::legal::工期对象合法吗?
EN

Stack Overflow用户
提问于 2018-03-28 06:24:24
回答 2查看 4.1K关注 0票数 29

像这样,制作和使用无限大的std::chrono::duration<double>作为包含的值是合法的吗?

代码语言:javascript
运行
复制
std::chrono::duration<double>{ std::numeric_limits<double>::infinity() };

它的行为会像我预期的那样,在加减其他时间时保持无限的价值吗?

我已经仔细研究了cp偏好,但我发现讨论这个问题的唯一一件事是duration_cast上的页面,指出:

当浮点值为NaN、无穷大或太大而无法用目标的整数类型表示时,从浮点持续时间到整数持续时间的转换会受到未定义的行为的影响。否则,转换为整数持续时间将与任何static_cast转换为整数类型一样受到截断的影响。

这似乎意味着这是合法的,但只是以一种反复无常的方式。

(我用这种类型来表示“请用X秒叫醒我”,而正无穷大是表示“我真的不关心什么时候醒来”的有用哨兵)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-03-28 07:40:10

infinity用于std::chrono::duration<double>的值将与算术运算符的行为如出一辙。

std::chrono::duration<double>是非常好的

[time.duration]定义了Rep上存在的用于template<class Rep> std::chrono::durationdouble的条件(每个[time.duration]/2),没有不允许的特殊值:

Rep应该是算术类型或模仿算术类型的类。

std::numeric_limits<double>::infinity()是非常好的

[time.duration.arithmetic][time.duration.nonmemberdefine]定义了算术运算符在duration上的行为。对于每个operator♦,并给两个duration对象( AB )保存doubleabA♦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())__。

这明确地意味着以下内容将如预期的那样运行:

代码语言:javascript
运行
复制
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 };
票数 15
EN

Stack Overflow用户

发布于 2018-03-28 07:40:00

为此,duration_values特性具有一个max()值:

代码语言:javascript
运行
复制
    std::chrono::duration<double>::max();

不要使用infinity。如果您将来碰巧将这样的持续时间转换为基于整数的类型,您可能会以UB结束。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49527483

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档