#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
的行为不符合预期?
答案 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