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
.