C++ 无限std::chrono::duration对象合法吗?

C++ 无限std::chrono::duration对象合法吗?,c++,c++11,language-lawyer,chrono,C++,C++11,Language Lawyer,Chrono,制作和使用std::chrono::duration中包含的值为无穷大是否合法 std::chrono::duration<double>{ std::numeric_limits<double>::infinity() }; std::chrono::duration{std::numeric_limits::infinity()}; 它的行为是否会像我预期的那样,在与其他持续时间相加或相减时保持无穷大的值 我翻阅了CPPPreference,但我发现讨论这个问题的

制作和使用
std::chrono::duration
中包含的值为无穷大是否合法

std::chrono::duration<double>{ std::numeric_limits<double>::infinity() };
std::chrono::duration{std::numeric_limits::infinity()};
它的行为是否会像我预期的那样,在与其他持续时间相加或相减时保持无穷大的值

我翻阅了CPPPreference,但我发现讨论这个问题的唯一一件事是
duration\u cast
上的页面,注意:

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

这似乎意味着这是合法的,但只是以一种反手的方式

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

该特征有一个
max()
值用于此目的:

    std::chrono::duration<double>::max();
std::chrono::duration::max();

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

std::chrono::duration的值
infinity
将与算术运算符的预期行为相同

std::chrono::duration
非常好 为
模板std::chrono::duration
定义
Rep
上存在的条件,并且明确允许(per)使用
double
,不允许使用特殊值:

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

std::numeric\u limits::infinity()
非常好 并定义算术运算符在
持续时间
上的行为。对于每个
运算符♦和给定的两个
duration
对象
A
B
持有
双值
A
B
A♦B
效果为
a♦b
会。例如,对于
+

在后面的函数描述中,
CD
表示函数的返回类型<代码>CR(A,B)
表示
通用类型


确定以无穷大作为操作数的运算结果的规则很简单:用有限数x替换无穷大,并在x变为无穷大时取极限。从@Yola开始,我不是在用double做算术,而是在用
std::chrono::duration
做算术,它可能对运算的域和范围有自己的看法。特别是因为
std::chrono::duration
是模板更常见的用例<代码>常数持续时间和运算符+=(常数持续时间和d);效果:仿佛由:rep_uz+=d.count()
constexpr rep count()常量;返回:RepFi.<代码>,在您的情况下,代码>代码> >代码>双< /代码>。还可以考虑您的设计是否对单独的状态变量“不关心”而不是区分值更好。如果你用双精度来表示时间,我怀疑你是否关心紧凑性。我很好奇你想用浮点值来表示时间的原因是什么。我自己想不出一个好的使用方法,除非你需要覆盖更大的范围,并且在更短的持续时间内有更高的精度。如果它只是更高的精度,你希望你可以考虑STD::Timo::微秒。浮点比许多方法中的量化值更方便,而且代码与一些认为时间为浮点第二计数的东西(即不是STD::SCORO,只是一个加倍)互操作。回答OP问题的目的是什么?OP问题是“是否允许无穷大并按预期工作?”。你写的东西很有价值,但它并没有回答我想的问题。目的是“我真的不在乎什么时候醒来”。
std::chrono::duration::max()
没有合适的属性充当(方便的)哨兵;使用无穷大可以对返回值进行一些加/减操作,而不会使其不再是sentinel值。我认为inf与max的不同之处在于Period(duration的第二个操作数)不等于1。当然,使用1(秒)和double是很自然的,但是可以定义一天的时间段,或者微秒。在具有不同句点的双持续时间之间转换时,值max()将不被保留,而值inf将被保留,并可用于以后的比较。查看std::chrono::duration\u cast的实现:
\u cast(const duration&\u d){typedef typename _ToDur::rep uu to _rep;return u ToDur(static_cast(u d.count())*static_cast(_CF::num)/static_cast(_CF::den))}
您可以看到它没有考虑max(),并且在进行类型转换或缩放时很可能溢出。
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);
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 };