`std::chrono` 时钟中的签名和未签名的 `rep`

Jer*_*emy 6 c++ std c++-chrono

rep类型std::chrono::system_clock必须是有符号算术类型,而steady_clockhigh_resolution_clock(和自定义时钟类型)不需要有符号rep类型。

这种区别的基本原理是什么,使用无符号rep类型的时钟会产生什么后果?

How*_*ant 5

其基本原理是让供应商有更多的steady_clock自由度high_resolution_clock。事后看来,这种自由并不是必要的,因为迄今为止的所有实现都使用有符号整数类型。

在这些时钟中使用无符号的后果rep是它们的duration嵌套类型不会是六个“预定义”持续时间之一:

nanoseconds
microseconds
milliseconds
seconds
minutes
hours
Run Code Online (Sandbox Code Playgroud)

因为这些都是需要签字的。此外,使用无符号时钟的客户端在从该时钟中减去 srep时必须小心:减去when会导致无符号溢出值:定义良好,但可能是意外的。time_pointt0 - t1t0 < t1

这样的时钟可以安全使用,并且确实存在无符号溢出的用例。但一般来说,它可能更容易出错。

这个纬度没有扩展到的原因system_clock是希望能够system_clock跟踪Unix Time,并且我想要求 1970-01-01 00:00:00 UTC 之前的日期时间可以用 表示system_clock::time_pointsystem_clock是与人类日历相关的唯一时钟。

在 C++20 规范草案中,最终将指定Unix 时间system_clock::time_point关系,并且与民用日历之间的转换将更加容易,包括 1970-01-01 00:00:00 UTC 之前的日期时间。

steady_clock仍然是一个“秒表”:非常适合计时,但与人类日历没有任何关系。