2017-01-03 38 views
0
#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的行为不如预期?

真正

真正

但实际产量为:

真正

发lse

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

+1

Coliru:http://coliru.stacked-crooked.com/a/4ee25ea413140aa8反正Wandbox印真假 – Danh

+2

我认为它是整数溢出 – Danh

+1

Wandbox上的'tp_now - tp_min'为负数。我认为丹是对的。 –

回答

2

随着:

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_nowzero更大,因此,当你减去它们,你会得到一个整数溢出,因为结果比std::numeric_limits<Rep>::max()大。在带符号后端的实现中,它是未定义的行为,在用无符号后端实现时,我不知道,但我想它的特殊比较将使其false

this exampletp_min是从它的划时代-9223372036854775808蜱,这个数字是与std::numeric_limits<duration::rep>::lowest()


TL相同; DR;它是整数溢出。不要使用

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

相反,使用

tp1 > tp2 
相关问题