[英]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.