在`std::chrono`时钟中,有符号和无符号的`rep`是什么?

7

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

这种差异的原理是什么?使用无符号rep类型的时钟会有什么后果?


1
C++17笔记:“要求:system_clock::duration::min() < system_clock::duration::zero()必须为真。[注:这意味着rep是有符号类型。—注]”猜测这允许您构造早于时代开始的时间点。对于大多数实现,这意味着早于1970年。 - Cheers and hth. - Alf
@P.W:谢谢,很有趣。我引用的是2017年3月21日发布的N4659版。我相信那是C++17的最终草案。 - Cheers and hth. - Alf
1个回答

5
原因是为了让供应商对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时间关系将被明确定义,并且将更容易地在民用日历和system_clock::time_point之间进行转换,包括1970年01月01日00:00:00 UTC之前的日期时间。
但是steady_clock仍然是一个“秒表”:非常适合计时,但与人类日历没有任何关系。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接