[英]Why does std::numeric_limits<seconds>::max() return 0?
我找到了一個有趣的問題, std::numeric_limits<seconds>::max()
返回0.答案是使用seconds::max()
或std::numeric_limits<seconds::rep>::max()
代替,但我很想知道為什么會這樣。 我希望它在編譯時失敗或者只是工作。 以下代碼演示了gcc 4.9.3的問題。
#include <iostream>
#include <limits>
#include <chrono>
using namespace std;
using namespace std::chrono;
int main(int /*argc*/, const char* /*argv*/[])
{
const auto maxSeconds = std::numeric_limits<seconds>::max();
std::cerr << maxSeconds.count() << "\n";
const auto maxSeconds2 = seconds::max();
std::cerr << maxSeconds2.count() << "\n";
return 0;
}
我在chrono頭文件中看不到任何隱式轉換。 如果duration
已隱式轉換為數字類型並且符號丟失或者bool
可能最終為零 - 但最大值為零則沒有意義。
正如TartanLlama指出的那樣,默認特化使用默認構造函數,因此返回0。
深入研究標准的舊副本,我看到以下dictats:
18.3.2.3類模板
numeric_limits
[numeric.limits]非算術標准類型,例如
complex<T>
(26.4.2),不應具有特化。
過了一會兒:
默認的
numeric_limits<T>
模板應包含所有成員,但具有0或false值。cv限定類型
cv T
上numeric_limits
的特化的每個成員的值應等於非限定類型T
上的特化成員的相應成員的值。
缺少的是解釋為什么委員會認為這比編譯失敗更好。 圖書館缺陷報告是否合理?
更新:我已將此作為ISO委員會的一個問題提出
std::numeric_limits
不專門用於std::chrono::seconds
。 為std::numeric_limits
所有數據成員和函數提供了缺省定義,以避免非特定類型的編譯器錯誤。 numeric_limits<T>::max()
的默認版本只返回T()
,在這種情況下為0
。
您可以檢查std::numeric_limits
是專門為給定的T
通過檢查在編譯時std::numeric_limits<T>::is_specialized
,默認為false
。
std::chrono::seconds
本身不是標准算術類型,因此std::numeric_limits
不是專門用於它的。 所以你只看到一些相當無用的默認值。
要查詢用於計算滴答的基礎類型的范圍(在gcc下,是64位long int
),請使用
std::numeric_limits<seconds::rep>::max();
代替。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.