Является ли std:: is unsigned: value хорошо определенным?
мне интересно, если
std::is_unsigned<bool>::value
хорошо определяется в соответствии со стандартом или нет?
Я задаю вопрос, потому что typename std::make_unsigned<bool>::type
Не определен.
4 ответа:
нет понятия знаковости для
bool
. От базового.fundamental] / 6:значения типа
bool
либоtrue
наfalse
. [Примечание: нетsigned
,unsigned
,short
илиlong
bool
типы или значения. - конец Примечания] значения типаbool
участие в интегральных акциях (4.5).наоборот, со знаком явным образом вызывается для элемента целое число со знаком типы (пункт 2) и целочисленные типы без знака (пункт 3).
теперь
is_signed
иis_unsigned
черты характера. Во-первых, черты всегда четко определены, но интересны только для арифметических типов.bool
- Это арифметический тип, иis_signed<T>::value
определяется (см. таблицу 49) КакT(-1) < T(0)
. Используя правила булевых преобразований и стандартных арифметических преобразований, мы видим, что это isfalse
на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
во время арифметических операций. Однако, это действительно не имеет смысла оцениватьbool
s signedness, гораздо меньше performmake_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
является беззнаковым.