std::chrono::system_clock
的 rep
类型必须是有符号算术类型,而 steady_clock
和 high_resolution_clock
(和自定义时钟类型)不需要具有签名的 rep
类型。
这种区别的基本原理是什么?使用无符号 rep
类型的时钟会产生什么后果?
最佳答案
这样做的理由是让供应商在 steady_clock
上有更多的自由。和 high_resolution_clock
.事后看来,这种自由并不是必需的,因为迄今为止所有的实现都使用带符号的整数类型。
使用未签名的 rep
的后果在这些时钟中是他们的 duration
嵌套类型不会是六个“预定义”持续时间之一:
nanoseconds
microseconds
milliseconds
seconds
minutes
hours
因为这些都是需要签名的。还有使用未签名 rep
的时钟的客户端必须小心减去 time_point
来自那个时钟的 s:减去 t0 - t1
什么时候t0 < t1
会导致无符号溢出值:定义明确,但可能出乎意料。
这样的时钟可以安全使用,并且确实存在无符号溢出的用例。但一般来说它可能更容易出错。
此纬度未扩展到 system_clock
的原因是希望system_clock
会跟踪 Unix Time ,我想要求 1970-01-01 00:00:00 UTC 之前的日期时间在 system_clock::time_point
中表示. system_clock
是与人类日历相关的唯一时钟。
在 C++20 规范草案中,Unix Time最终会指定关系,system_clock::time_point
之间的转换会容易得多和民用日历,包括 1970-01-01 00:00:00 UTC 之前的日期时间。
但是steady_clock
仍然是一个“秒表”:非常适合计时,但与人类日历没有任何关系。
关于c++ - `rep` 时钟中的有符号和无符号 `std::chrono`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52495777/