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 };