Differences between std::is_integer and std::is_integral?

徘徊边缘 提交于 2019-12-21 03:13:38

问题


C++11 provides two type trait template classes: std::is_integer and std::is_integral. However, I cannot tell the differences between them.

What type, say T, can make std::is_integer<T>::value true and make std::is_integral<T>::value false?


回答1:


std::is_integer<T> does not exist.

That being said, std::numeric_limits<T>::is_integer does exist.

I'm not aware of any significant difference between std::numeric_limits<T>::is_integer and std::is_integral<T>. The latter was designed much later and became standard in C++11, whereas the former was introduced in C++98.




回答2:


There is no type T that has different results for std::is_integral<T>::value and std::numeric_limits<T>::is_integer. To quote the draft Standard:

3.9.1 Fundamental types [basic.fundamental]

7 Types bool, char, char16_t, char32_t, wchar_t, and the signed and unsigned integer types are collectively called integral types. A synonym for integral type is integer type.[...]

18.3.2.4 numeric_limits members [numeric.limits.members]

static constexpr bool is_integer;

17 True if the type is integer.

20.9.4.1 Primary type categories [meta.unary.cat] (table 47)

template <class T> struct is_integral;

T is an integral type (3.9.1)




回答3:


std::is_integral_v<T> will only return true for built-in integers.

The standard allows std::numeric_limits<T>::is_integer to be specialized and return true for custom integral types like boost::multiprecion::cpp_int.




回答4:


The difference is that std::is_integral<T> will only recognize decimal integers including bool char char16_t char32_t wchar_t short int long long long. While std::numeric_limits<T>::is_integer will recognize all of those aswell as float double. Look at these two pages for more information: is_integer, is_integral



来源:https://stackoverflow.com/questions/14676574/differences-between-stdis-integer-and-stdis-integral

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!