我知道std::numeric_limits<bool>::is_signed
总是假的,但std::is_signed<bool>::value
也是如此吗?感谢
答案 0 :(得分:4)
std::is_signed
定义如下(表49 - 类型属性谓词,n3485):
is_arithmetic<T>::value && T(-1) < T(0)
bool
是一个整数类型[basic.fundamental] / 7,因此算术类型[basic.fundamental] / 8。
bool(x)
其中x
是int
,使用布尔转换[conv.bool] / 1
算术,无范围枚举,指针或指向成员类型的指针的prvalue可以转换为
bool
类型的prvalue。零值,空指针值或空成员指针值将转换为false
;任何其他值都将转换为true
。 [...]
所以我们bool(-1) < bool(0)
评估true < false
,这是主题(参见[expr.rel] / 2)到通常的算术转换[expr] / 10 =&gt;积分促销[conv.prom] / 6
bool
类型的prvalue可以转换为int
类型的prvalue,其中false
变为零true
成为一个。
比较然后读取1 < 0
,即false
。该支票保证评估为false
。
在n3797中,在修复LWG 2197之后,检查定义如下:
如果
is_arithmetic<T>::value
为true
,则结果与integral_constant<bool, T(-1) < T(0)>::value
相同;否则,false
T == bool
。
答案 1 :(得分:1)
从20.9.4.3,表49:
is_arithmetic :: value&amp;&amp; T(-1)&lt; T(0)
那么在转换为bool时会将-1转换为什么?当然,1:
零值,空指针值或空成员指针值 转换为假;任何其他值都转换为true。
(4.12)