С:
using clock = std::chrono::system_clock;
using time_point = std::chrono::time_point<clock>;
time_point
реализуется как если он хранит значение типа Длительность указывающей интервал времени от начала эпохи для часов. (См 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()
. В реализации с подписанным back-end, это неопределенное поведение, в реализации с неподписанным back-end, я не знаю об этом, но, я думаю, его специальное сравнение сделает его false
.
В this example, tp_min
является -9223372036854775808
тиков от своей эпохи, что число совпадает с std::numeric_limits<duration::rep>::lowest()
TL; DR; Это целочисленное переполнение. Не используйте
(tp1 - tp2) > std::chrono::duration<whatever_rep>::zero
Вместо этого используйте
tp1 > tp2
Coliru: http://coliru.stacked-crooked.com/a/4ee25ea413140aa8 Во всяком случае, Wandbox напечатано верно неверно – Danh
Я думаю, что это целочисленное переполнение – Danh
'tp_now - tp_min' отрицательный на Wandbox. Я думаю, что Дэн прав. –