簡體   English   中英

std::is_integer 和 std::is_integral 的區別?

[英]Differences between std::is_integer and std::is_integral?

C++11 提供了兩種類型特征模板類: std::is_integerstd::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_integerstd::is_integral<T>之間有什么顯着區別。 后者設計得晚得多並成為 C++11 的標准,而前者是在 C++98 中引入的。

沒有類型Tstd::is_integral<T>::valuestd::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_integeris_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.

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