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