使用无穷值初始化std::chrono::duration<double>是否合法及行为如何?
关于std::chrono::duration无穷值的合法性与加减行为
好问题!咱们一步步来拆解:
首先明确:创建包含无穷值的std::chrono::duration<double>是完全合法的。
C++标准并没有限制浮点类型的duration存储的值范围——毕竟它的底层就是double,而double本身支持IEEE 754规定的无穷大、NaN等特殊值。你写的这行代码:
std::chrono::duration<double>{ std::numeric_limits<double>::infinity() };
完全符合标准要求,现代编译器(只要环境支持IEEE 754浮点,这几乎是所有平台的标配)都不会报错。
接下来聊加减操作的行为:这本质上由底层double的算术规则决定,chrono::duration只是对数值做了单位封装,加减运算会直接委托给底层类型的计算,所以大部分情况会符合你对无穷值的预期,但有几个细节要注意:
- 无穷值和任何有限值加减:结果仍然是同符号的无穷大。比如
inf + 2.5s、inf - 100ms,结果都会保持无穷大。 - 同符号无穷值相加:结果还是同符号的无穷大(比如
inf + inf = inf,-inf + (-inf) = -inf)。 - 正无穷和负无穷相加减:结果会变成NaN。比如
inf + (-inf)、inf - inf,这时候就不再是无穷值了——这是IEEE 754浮点运算的固有特性,不是chrono的特殊处理。
你提到cppreference只在duration_cast里提了浮点转整数的情况,这很正常:因为浮点duration本身的数值行为就是遵循底层浮点类型的,标准不需要额外重复规定,只要duration的算术操作满足对应的代数要求即可,而IEEE 754的运算规则是符合这些要求的。
内容的提问来源于stack exchange,提问作者James Picone
相关产品推荐
相关产品推荐

