std :: is_integer和std :: is_integral之间的区别?

时间:2013-02-03 19:52:49

标签: c++ c++11 language-lawyer typetraits

C ++ 11提供了两种类型的特征模板类:std::is_integerstd::is_integral。但是,我不能说出它们之间的区别。

什么类型,例如T,可以使std::is_integer<T>::value成立并使std::is_integral<T>::value成为假?

5 个答案:

答案 0 :(得分:20)

std::is_integer<T>不存在。

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

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

答案 1 :(得分:12)

Tstd::is_integral<T>::value没有类型std::numeric_limits<T>::is_integer有不同的结果。引用draft Standard

3.9.1基本类型[basic.fundamental]

  

7类型bool,char,char16_t,char32_t,wchar_t,以及签名和   无符号整数类型统称为整数类型。一个   整数类型的同义词是整数类型。[...]

18.3.2.4 numeric_limits members [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)

答案 2 :(得分:1)

std::is_integral_v<T>仅对内置整数返回true。

该标准允许std::numeric_limits<T>::is_integer专用,并为boost::multiprecion::cpp_int等自定义整数类型返回true。

答案 3 :(得分:1)

std::is_integral<T>std::numeric_limits<T>::is_integer不同。例如。 boost::multiprecision大整数的处理方式有所不同。

这是来自相应的问题:

is_integral返回有关类型性质的信息,并且为 仅对“本机”整数类型为true,对于 类类型。也就是说is_integeris_class相互 独家。

另一方面,

numeric_limits返回有关 类型的行为-是否为特定概念建模 将-因此应该专门用于UDT。注意专业 is_integer代表UDT将破坏代码,因为is_integer暗示 其他很多事情也都是真实的,例如琐碎的移动/复制/初始化 等

答案 4 :(得分:0)

区别在于std::is_integral<T>只会识别十进制整数,包括bool char char16_t char32_t wchar_t short {{ 1}} int long。虽然long long会识别所有这些内容以及std::numeric_limits<T>::is_integer float。请查看这两页以获取更多信息:is_integeris_integral