为什么std :: chrono :: time_point的行为不符合预期?

时间:2017-01-03 06:22:09

标签: c++ c++11 time semantics c++-standard-library

#include <chrono>

int main()
{
    using clock = std::chrono::system_clock;
    using time_point = std::chrono::time_point<clock>;

    auto tp_now = clock::now();
    auto tp_min = time_point::min();

    bool b1 = tp_now > tp_min;
    bool b2 = (tp_now - tp_min) > std::chrono::seconds{ 0 };
    cout << boolalpha << b1 << endl << b2 << endl;
}

预期输出为:

  

     

但实际输出是:

  

     

为什么std::chrono::time_point的行为不符合预期?

1 个答案:

答案 0 :(得分:2)

使用:

using clock = std::chrono::system_clock;
using time_point = std::chrono::time_point<clock>;
实现

time_point就好像它存储了一个类型为Duration的值,表示从Clock's epoch开始的时间间隔。 (见std::chrono::time_point

duration成员类型clock(以及time_point)能够代表负数持续时间。

因此,您的实现中的duration可以使用后端有符号整数来实现(它可以使用无符号整数实现,但具有复杂的比较)。

在该特定实施中,

time_point::min();
time_point t(clock::duration::min());
time_point t(clock::duration(std::numeric_limits<Rep>::lowest()));

tp_now大于zero,因此当您减去它们时,会得到整数溢出,因为结果大于std::numeric_limits<Rep>::max()。在带有签名后端的实现中,它是未定义的行为,在使用未签名的后端实现时,我不知道它,但我想它的特殊比较将使其false。< / p>

this example中,tp_min从其纪元开始是-9223372036854775808个刻度,该数字与std::numeric_limits<duration::rep>::lowest()相同

TL; DR;它的整数溢出。不要使用

(tp1 - tp2) > std::chrono::duration<whatever_rep>::zero

相反,请使用

tp1 > tp2
相关问题