Различия между std:: is_integer и std:: is_integral? - программирование
Подтвердить что ты не робот

Различия между 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?

4b9b3361

Ответ 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