簡體   English   中英

為什么std :: chrono :: time_point的行為不符合預期?

[英]Why does std::chrono::time_point not behave as expected?

#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行為不符合預期?

帶有:

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

實現time_point就好像它存儲了一個類型為Duration的值,該值指示從時鍾紀元開始的時間間隔。 (請參閱std::chrono::time_point

clock (和time_point )的duration成員類型能夠表示負的持續時間。

因此,實現的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

此示例中tp_min從其紀元tp_min-9223372036854775808滴答,該數字與std::numeric_limits<duration::rep>::lowest()


TL; DR; 這是整數溢出。 不要使用

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

相反,使用

tp1 > tp2

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM