2017-01-03 77 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 
相關問題