2013-03-09 55 views
5

std::is_signed<T>std::numeric_limits<T>::is_signed都應該給出關於T的簽名的答案。
爲什麼現在有兩個簽名指示符(即從C++ 11開始)?std :: is_signed之間的區別<T>和std :: numeric_limits <T> :: is_signed?

+4

'std :: is_signed '是一種類型,而'std :: numeric_limits :: is_signed'成員只是一個值。在元編程中,讓前者更方便,也更一致。 – Xeo 2013-03-09 00:36:04

+1

那麼你實際上使用'std :: is_signed :: value'。你會直接在哪裏使用'std :: is_signed '? – 2013-03-09 00:37:14

+0

但是他們的結果是否有所不同? – smilingthax 2013-03-09 00:38:29

回答

7

我會冒險猜測唯一的區別是如果std::numeric_limits<T>專門爲用戶定義的類型。這種用戶定義類型當然可以爲is_signed提供自己的值。但要求這種類型的std::is_signed<T>::value將始終返回false除非std::is_signed<T>已被獨立專門化。

它好像是std::is_signed<T>代表的條件是

is_arithmetic<T>::value && T(-1) < T(0) 

更新:永遠在線見地霍華德Hinnant(欣南特)points out,雖然std::numeric_limits<>可以合法,專業,沒有什麼<type_traits>被允許除非另有規定,否則專門化,並且is_signed未被指定爲可專門化。

因此,std::numeric_limits<T>::is_signed可能爲用戶定義類型的返回true(如果它被專業),但std::is_signed<T>::value將始終爲用戶定義類型返回false

+0

您可以專注於' std :: numeric_limits '爲用戶定義的類型?在C++ 03中,用戶向命名空間「std」添加任何內容都是非法的。 C++ 11已經解除了這個限制嗎? – 2013-03-09 01:01:29

+0

@DavidHammen:不,限制在那裏,但不適用於專業化。你可以在'std'中專門化現有的模板,你不能添加你自己的東西。 – 2013-03-09 01:04:45

+0

@DavidHammen:在命名空間'std'中完全專門化模板總是合法的,只是不能部分專門化類模板或重載函數/函數模板。 – ildjarn 2013-03-09 01:04:57

相關問題