std :: is_unsigned <bool> :: value是否定义良好?
我想知道是否
std::is_unsigned<bool>::value
根据标准是否明确定义?
我问这个问题,因为typename std::make_unsigned<bool>::type
没有很好的定义。
bool
没有签名的概念。 从[basic.fundamental] / 6:
bool
types的bool
是true
false
。 [ 注意 :没有有signed
,unsigned
,short
或long
bool
types或值。 – 结束注释 ]bool
types的bool
参与整体促销(4.5)。
相比之下,对于有符号整数types (段落2)和无符号整数types (段落3),显式地调用了signedness。
现在是is_signed
和is_unsigned
特征。 首先,特征总是明确的,但只对算术types有意义。 bool
是一个算术types,并且被定义为T(-1) < T(0)
is_signed<T>::value
被定义(参见表49 T(-1) < T(0)
。 通过使用布尔转换和标准算术转换的规则,我们可以看到T = bool
(因为bool(-1)
为true
,转换为1
),这是false
。 类似地, is_unsigned<T>::value
被定义为T(0) < T(-1)
,这对于T = bool
是true
的。
is_unsigned
在[meta.unary.comp] / 2中定义为
如果
is_arithmetic<T>::value
为true
,则结果与
bool_constant<T(0) < T(-1)>::value
; 否则,是false
bool
†显然是一个算术types(是整数)。 现在考虑一下[conv.bool] / 1:
零值,空指针值或空成员指针值被转换为
false
; 任何其他值都转换为true
。
即, bool(0) < bool(-1)
相当于false < true
,后者成立,因为值分别被提升为0
和1
。
因此,由于bool
ean值对应于算术运算期间的无符号值0
和1
,因此is_unsigned<bool>::value
为true
(相反, is_signed
为false
)。 然而,评估bool
的签名是没有意义的,更不用说执行make_unsigned
了,因为它不代表整数,而是状态。
† :该模板首先适用于bool
的事实取决于其要求条款不存在, bool
不是不完整的types([res.on.functions] /(2.5)),没有其他要求在[meta.rqmts]中为UnaryTypeTraits提到 。
是的,它和其他一元types特征一样是明确的。
C ++ 14(n4140)20.10.4 / 2“一元types特征”的任务:
如果相应的条件为真,则这些模板中的每一个应该是具有true_type的BaseCharacteristic的UnaryTypeTrait(20.10.1),否则是
false_type
。
20.10.1 / 1:
UnaryTypeTrait描述一个types的属性。 它应该是一个类模板,它接受一个模板types参数,并且可以select附加的参数来帮助定义被描述的属性。 它应该是
DefaultConstructible
,CopyConstructible
,并直接或间接地从其基本属性(它是模板integral_constant
(20.10.3)的专门化)中公开和明确地派生出来的,模板的参数由要求的特定属性被描述。 BaseCharacteristic的成员名称不能被隐藏,并且应该在UnaryTypeTrait中明确可用。
std::is_unsigned<T>::value
对于任何typesT
,构造std::is_unsigned<T>::value
必须被很好地定义,“signedness”的概念是否对types有意义。
是的,它定义的很好,结果应该是std::is_unsigned<bool>::value == true
std::is_signed
的文件说
如果
T
是一个有符号的算术types ,则提供成员常数值等于true。 对于任何其他types,价值是假的。
那么,如果你看看std::is_arithmetic
如果T是算术types(即整型或浮点型 ),则提供成员常数值等于true。 对于任何其他types,价值是假的。
最后导致std::is_integral
检查T是否是整数types。 如果T是types
bool
,char
,char16_t
,char32_t
,wchar_t
,short
,int
,long
,long long
或任何实现定义的扩展整数types(包括任何有符号,无符号,和cv合格的变体。 否则,值等于假。
有趣的是,还有另外一个std::numeric_limits::is_signed
函数
对于所有带符号的算术types
T
,std::numeric_limits<T>::is_signed
值为true
,对于无符号types则为false
。 这个常数对于所有的专业都是有意义的。
如果bool
的专业化被列为false
,这也证实了bool
被认为是无符号的。