2017-01-03 3 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; 
} 

Die erwartete Ausgabe lautet:Warum verhält sich std :: chrono :: time_point nicht wie erwartet?

wahr

wahr

Aber die tatsächliche Ausgabe lautet:

wahr

fa lse

Warum verhält sich std::chrono::time_point nicht wie erwartet?

+1

Coliru: http://coliru.stacked-crooked.com/a/4ee25ea413140aa8 Wie dem auch sei, Wandbox gedruckt true false – Danh

+2

Ich denke, es ist Integer-Überlauf – Danh

+1

'tp_now - tp_min' ist negativ auf Wandbox. Ich denke Danh hat Recht. –

Antwort

2

mit:

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

time_point als implementiert, wenn es einen Wert vom Typ Dauer speichert das Zeitintervall von dem Beginn der Epoche der Uhr anzeigt. (Siehe std::chrono::time_point)

Der duration Mitglied Typ clock (und time_point) fähig ist, der für negatives Zeitdauern.

So kann duration in Ihrer Implementierung mit einer Back-End-Ganzzahl mit Vorzeichen implementiert werden (es kann mit vorzeichenlosen Ganzzahlen implementiert werden, aber mit einem komplizierten Vergleich). so

In dieser speziellen Implementierung

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

und tp_now größer als zero, wenn man sie abziehen, erhalten Sie einen Integer-Überlauf kommen, weil das Ergebnis größer als std::numeric_limits<Rep>::max() ist. In der Implementierung mit signierten Back-End, ist es undefiniertes Verhalten, in der Implementierung mit unsigned Back-End, weiß ich nicht darüber, aber ich denke, seine speziellen Vergleich wird seine false machen.

In this example, tp_min-9223372036854775808 Zecken aus seiner Epoche ist, ist, dass die gleiche Anzahl mit std::numeric_limits<duration::rep>::lowest()


TL; DR; Es ist Integer-Überlauf. Sie

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

nicht Stattdessen benutzen, verwenden

tp1 > tp2 
Verwandte Themen