Различия между std:: is_integer и std:: is_integral?
С++ 11 предоставляет два типа шаблонов шаблонов типов: std::is_integer
и std::is_integral
. Однако я не могу сказать о различиях между ними.
Какой тип, скажем T, может сделать std::is_integer<T>::value
true и сделать std::is_integral<T>::value
false?
Ответы
Ответ 1
std::is_integer<T>
не существует.
При этом std::numeric_limits<T>::is_integer
существует.
Я не знаю никакой существенной разницы между std::numeric_limits<T>::is_integer
и std::is_integral<T>
. Последний был разработан намного позже и стал стандартным в С++ 11, тогда как первый был введен в С++ 98.
Ответ 2
Нет типа T
, который имеет разные результаты для std::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 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)
Ответ 3
Разница в том, что 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_integer, is_integral