2015-04-01 54 views
5

下面的代碼:爲什麼數字10參考整數類型0?

#include <iostream> 
#include <limits> 
#include <cstdint> 

int main() 
{ 
    std::cout << std::numeric_limits<std::uint64_t>::digits10 << "\n" 
       << std::numeric_limits<std::uint64_t&>::digits10 << "\n"; 
} 

輸出

我希望std::uint64_t&有相同的值std::uint64_t:是否有這種差異的一個原因?

+2

'的std :: numeric_limits'不擅長該類型,所以它默認爲0。 – 0x499602D2 2015-04-01 13:59:09

+1

從語言設計的角度來看,不應該默認爲編譯錯誤嗎? – 2015-04-01 14:00:59

+2

沒有具體的原因 - 它只是使參考類型在'numeric_limits'中具有相同的值,因爲非參考需要額外的努力,並且沒有人認爲它會使您方便。如果你關心你,你可以'std :: remove_reference :: type'。 – milleniumbug 2015-04-01 14:04:30

回答

2

18.3.2.1/2:

專業化應爲每種算術類型提供,包括 浮點數和整數,包括bool。對於所有這些numeric_limits的特殊化,成員is專業化 應爲真。

所以我們知道對於這些非參考類型將存在專門化。然後18.3.2.3/1:

默認numeric_limits模板應具有所有成員,但 的值爲0或false。

我懷疑有人做過這樣,因爲你總是可以is_specialized static_assert強制編譯錯誤,但也可能會被一些模板應用,其中0將是一個或多個限制一個確定的默認值。如果你想能夠測試引用,只需運行它std::remove_reference

我不確定專爲您自己的類型numeric_limits是否合法。 18.3.2.1/4中的標準說:

非算術標準類型,如複雜的(26.4.2),不應該 有專業化。

我個人認爲這個標準是「該標準不會爲非算術標準庫類型提供專門化,但是專門針對用戶類型是完全合法的」。你可以簡單地閱讀它,完全禁止任何未提供的專業化。

+0

似乎是一個蹩腳的錯誤,但現在這是最好的A,如果有人沒有拿出一個答案來解釋我會接受的推理。 :) – NoSenseEtAl 2015-04-01 14:58:20

+0

爲非算術'T'專門設置'std :: numeric_limits' [不允許](https://stackoverflow.com/questions/8513417/what-c​​an-and-cant-i-specialize-in-在-STD-命名空間)。 – edmz 2015-04-01 15:02:22

+0

@MarkB我指的是:「numeric_limits不應該專門用於非算術標準類型」。你不能專注於'std'命名空間,以我的理解(其他人應該允許btw)。還是你的意思是別的? – edmz 2015-04-01 15:13:24

0

std::numeric_limits預計專門用於基本的算術數據類型(整數和浮點數)。任何類型的參考都不屬於他們,這就是爲什麼選擇非專業模板,其所有成員都是false0)。

我期望的std :: uint64_t中&有相同的值的std :: uint64_t中:是 有這種差異的一個原因?

雖然std::uint64_t是算術式,std::uint64_t&是這樣的化合物類型,並且具有不同的含義。您有幾個選項:

  • 請始終考慮基本類型,方法是刪除引用,指針或兩者。
  • static_assert(is_arithmetic<>)
  • 檢查std::numeric_limits<T>::is_specialized
相關問題