簡體   English   中英

為什么std :: numeric_limits <seconds> :: max()返回0?

[英]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 Tnumeric_limits的特化的每個成員的值應等於非限定類型T上的特化成員的相應成員的值。

缺少的是解釋為什么委員會認為這比編譯失敗更好。 圖書館缺陷報告是否合理?


更新:我已將此作為ISO委員會的一個問題提出

https://issues.isocpp.org/show_bug.cgi?id=186

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.

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