rep
的{{1}}类型必须是带符号的算术类型,而std::chrono::system_clock
和steady_clock
(以及自定义时钟类型)则不需要带符号high_resolution_clock
类型。
进行这种区分的理由是什么?使用无符号rep
类型的时钟会产生什么后果?
答案 0 :(得分:2)
这样做的理由是让供应商在steady_clock
和high_resolution_clock
上有更多的自由。事后看来,自由并不是必需的,因为迄今为止所有实现都使用带符号整数类型。
在这些时钟中使用无符号rep
的后果是,它们的duration
嵌套类型将不是六个“预定义”持续时间之一:
nanoseconds
microseconds
milliseconds
seconds
minutes
hours
因为这些都需要签名。同样,使用无符号rep
的时钟的客户端也必须注意从该时钟中减去time_point
:当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
仍然是“秒表”:非常适合计时,但与人类日历没有任何关系。