为什么chrono :: nanoseconds的表示类型是有符号整数类型?

Mic*_*ser 2 c++ std c++-chrono

在文件/usr/include/c++/4.8中的gcc 4.84中我们有

namespace std  
{
   typedef duration<int64_t, nano>     nanoseconds;
Run Code Online (Sandbox Code Playgroud)

为什么纳秒的表示类型是有符号整数类型?为什么不签名?我们什么时候可以有一个负值的持续时间对象?

Jon*_*ely 7

我们什么时候可以有一个负值的持续时间对象?

任何时候你想表示一个负面的持续时间!

例如"提前十秒" std::chrono::seconds(-10),如果你把它添加到某些,time_point t那么你得到的time_point 是十秒之前t.

标准说"A duration类型测量两个时间点之间的时间(time_points)." 它并没有说它只能测量非减少时间点之间的时间.这意味着它可以用来衡量之间的时间t1,t2甚至是t2 < t1.要做到这一点,你需要一个负值.

如果持续时间无法签名,那么,为了表示一个意味着"更早"而不是"更晚"的偏移,你必须使用类似的std::pair<bool, duration>地方,bool无论是正偏移还是负偏移,然后你必须做:

chrono::time_point adjust(chrono::time_point t, pair<bool, duration> offset)
{
  if (offset.first)  // positive
    return t + offset.second;
  else // negative
    return t - offset.second;
}
Run Code Online (Sandbox Code Playgroud)

这是愚蠢的.通过使用有符号整数,语言和硬件已经更加明确和有效地支持了这一点.


Bat*_*eba 6

如果两个对象ab被定义为使得a - b为持续时间,那么它的期望具有a - b = -(b - a).

要实施反交换财产,需要签署持续时间.