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

时间:2018-09-25 10:17:16

标签: c++ std chrono

rep的{​​{1}}类型必须是带符号的算术类型,而std::chrono::system_clocksteady_clock(以及自定义时钟类型)则不需要带符号high_resolution_clock类型。

进行这种区分的理由是什么?使用无符号rep类型的时钟会产生什么后果?

1 个答案:

答案 0 :(得分:2)

这样做的理由是让供应商在steady_clockhigh_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仍然是“秒表”:非常适合计时,但与人类日历没有任何关系。