[英]Differences between std::is_integer and std::is_integral?
C++11 提供了兩種類型特征模板類: std::is_integer
和std::is_integral
。 但是,我無法說出它們之間的區別。
什么類型,比如 T,可以使std::is_integer<T>::value
真並使std::is_integral<T>::value
假?
std::is_integer<T>
不存在。
話雖如此, std::numeric_limits<T>::is_integer
確實存在。
我不知道std::numeric_limits<T>::is_integer
和std::is_integral<T>
之間有什么顯着區別。 后者設計得晚得多並成為 C++11 的標准,而前者是在 C++98 中引入的。
沒有類型T
對std::is_integral<T>::value
和std::numeric_limits<T>::is_integer
有不同的結果。 引用標准草案:
3.9.1 基本類型[basic.fundamental]
7 類型 bool、char、char16_t、char32_t、wchar_t,以及有符號和無符號整數類型統稱為整型。 整數類型的同義詞是整數類型。[...]
18.3.2.4 numeric_limits 成員 [numeric.limits.members]
static constexpr bool is_integer;
17 如果類型為整數,則為真。
20.9.4.1 主要類型類別 [meta.unary.cat] (表 47)
template <class T> struct is_integral;
T 是整數類型 (3.9.1)
std::is_integral_v<T>
只會為內置整數返回 true。
該標准允許std::numeric_limits<T>::is_integer
被特化,並為boost::multiprecion::cpp_int
等自定義整數類型返回 true 。
std::is_integral<T>
和std::numeric_limits<T>::is_integer
不一樣。 例如boost::multiprecision
big int 的處理方式不同。
這是來自一個相應的問題:
is_integral
返回有關類型性質的信息,僅對“本機”整數類型為真,對於類類型不應該為真。 也就是說is_integer
和is_class
是互斥的。另一方面,
numeric_limits
返回有關類型行為的信息 - 如果您願意,它是否對特定概念進行建模 - 因此應該專門用於 UDT。 請注意,為 UDT 專門化is_integer
會破壞代碼,因為is_integer
意味着許多其他事情也是正確的,例如微不足道的移動/復制/初始化等。
不同之處在於std::is_integral<T>
只會識別十進制整數,包括bool
char
char16_t
char32_t
wchar_t
short
int
long
long long
。 雖然std::numeric_limits<T>::is_integer
將識別所有這些以及float
double
。 查看這兩個頁面了解更多信息: is_integer , is_integral
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.