32

C++11 提供了两种类型特征模板类:std::is_integerstd::is_integral. 但是,我无法分辨它们之间的区别。

什么类型,比如说 T,可以使std::is_integer<T>::value真假std::is_integral<T>::value假?

4

5 回答 5

33

std::is_integer<T>不存在。

话虽如此,std::numeric_limits<T>::is_integer确实存在。

我不知道 和 之间有任何显着std::numeric_limits<T>::is_integer区别std::is_integral<T>。后者的设计要晚得多,并在 C++11 中成为标准,而前者是在 C++98 中引入的。

于 2013-02-03T20:01:09.817 回答
18

没有任何类型Tstd::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)

于 2013-02-05T08:05:55.973 回答
4

std::is_integral_v<T>只会为内置整数返回 true。

该标准允许std::numeric_limits<T>::is_integer对自定义整数类型(如boost::multiprecion::cpp_int.

于 2018-02-27T10:14:43.747 回答
1

std::is_integral<T>并且std::numeric_limits<T>::is_integer不一样。例如boost::multiprecision,大整数的处理方式不同。

这是来自相应的问题:

is_integral返回有关类型性质的信息,并且仅对“本机”整数类型为真,对于类类型永远不应该为真。也就是说is_integeris_class是互斥的。

numeric_limits另一方面,返回有关类型行为的信息——如果你愿意,它是否对特定概念进行建模——因此应该专门用于 UDT。请注意,专门 is_integer针对 UDT 会破坏代码,因为is_integer这意味着许多其他事情也是正确的,例如微不足道的移动/复制/初始化等。

于 2020-05-02T09:53:06.363 回答
0

不同之处在于它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_integeris_integral

于 2017-10-12T00:06:45.840 回答