Является ли 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илиlongboolтипы или значения. - конец Примечания] значения типа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во время арифметических операций. Однако, это действительно не имеет смысла оцениватьbools 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является беззнаковым.