Является ли std:: is unsigned: value хорошо определенным?


мне интересно, если

std::is_unsigned<bool>::value

хорошо определяется в соответствии со стандартом или нет?

Я задаю вопрос, потому что typename std::make_unsigned<bool>::type Не определен.

4 55

4 ответа:

нет понятия знаковости для bool. От базового.fundamental] / 6:

значения типа bool либо true на false. [Примечание: нет signed,unsigned,short или longbool типы или значения. - конец Примечания] значения типа bool участие в интегральных акциях (4.5).

наоборот, со знаком явным образом вызывается для элемента целое число со знаком типы (пункт 2) и целочисленные типы без знака (пункт 3).

теперь is_signed и is_unsigned черты характера. Во-первых, черты всегда четко определены, но интересны только для арифметических типов. bool - Это арифметический тип, и is_signed<T>::value определяется (см. таблицу 49) Как T(-1) < T(0). Используя правила булевых преобразований и стандартных арифметических преобразований, мы видим, что это is false на T = bool (поскольку bool(-1) и true, который преобразует к 1). Точно так же,is_unsigned<T>::value определяется как T(0) < T(-1), которая составляет true на T = bool.

is_unsigned определяется в [meta.унарный.comp] / 2 as

если is_arithmetic<T>::value и true, тот же результат, что и
bool_constant<T(0) < T(-1)>::value; в противном случае,false

bool явно арифметический тип (является неотъемлемой частью). Теперь рассмотрим [конв.bool]/1:

нулевое значение, значение нулевого указателя или значение указателя нулевого члена преобразуется в false; любое другое значение преобразуется в true.

т. е. bool(0) < bool(-1) эквивалентно false < true, и последнее выполняется, так как значения повышаются до 0 и 1, соответственно.

is_unsigned<bool>::value и true (и, наоборот, is_signed и false), из-за того, что boolзначения ean соответствуют значениям без знака 0 и 1 во время арифметических операций. Однако, это действительно не имеет смысла оценивать bools signedness, гораздо меньше perform make_unsigned на нем, так как он не представляет целые числа, но скорее государства.


: дело в том, что этот шаблон применим к bool в первую очередь определяется тем, что его условие требования не существует,bool не будучи неполным типом ([res. on.функции] / (2.5)) и никаких других требований, упомянутых в [meta.rqmts] для UnaryTypeTraits.

Да, он четко определен, как и любой другой признак унарного типа.

в C++14 (n4140) 20.10.4/2 "тип унарный черты" задачи:

каждый из этих шаблонов должен быть UnaryTypeTrait (20.10.1) с базовой характеристикой true_type Если соответствующее условие истинно, в противном случае false_type.

20.10.1/1:

A UnaryTypeTrait описывает свойство типа. Это должен быть шаблон класса, который принимает один тип шаблона аргумент и, при необходимости, дополнительные аргументы, которые помогают определить описываемое свойство. Это должно быть DefaultConstructible,CopyConstructible, и публично и недвусмысленно, прямо или косвенно, от его BaseCharacteristic,, который является специализацией шаблона integral_constant (20.10.3), с аргументами к шаблону integral_constant определяется требованиями к конкретному свойство описывается. Имена членов базового признака не должно быть скрыто и должно быть однозначно доступно в UnaryTypeTrait.

из этого следует, что конструкция std::is_unsigned<T>::value должен быть четко определен для любого типа T, имеет ли понятие "знаковость" смысл для типа или нет.

Да это хорошо определено и результат должен быть std::is_unsigned<bool>::value == true

документация std::is_signed говорит

если T - это знаковый арифметический тип, обеспечивает постоянный член value равных правда. Для любого другого типа, значение false.

так что если вы посмотрите на std::is_arithmetic

если T-арифметический тип (то есть интегральный тип или a тип с плавающей запятой), обеспечивает постоянный член value равных правда. Для любого другого типа, значение false.

что, наконец, приводит к std::is_integral

проверяет, является ли T целочисленным типом. предоставляет постоянное значение члена, которое равно true, если T-Тип bool,char,char16_t,char32_t,wchar_t,short,int,long,long long, или любое определенное реализацией расширенное целое число видах, включая любые подписанные, неподписанные, и резюме квалифицированных вариантов. В противном случае значение равно false.

интересно, что есть еще одна функция std::numeric_limits::is_signed что государства

значение std::numeric_limits<T>::is_signed и true для всех арифметических типов со знаком T и false для типов без знака. Эта константа имеет значение для всех специализаций.

где специализация на bool указан как false, что также подтверждает, что bool является беззнаковым.