繁体   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