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

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.


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)


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.