2014-03-24 53 views
5

我知道std::numeric_limits<bool>::is_signed将永远是错误的,但对于std::is_signed<bool>::value也是如此?感谢是std :: is_signed <bool> ::值保证返回false?

+0

通过那些文档,清楚。寻找标准报价? – Yakk

+0

有趣的问题。 'bool'是一个整数类型,因此是一个算术类型,而'is_signed'是基于检查'is_arithmetic :: value && T(-1) dyp

+0

@Yakk是的,无论您提供什么样的支持。如果在'std :: is_signed :: value'中没有保证,那么在我的模板中测试'std :: numeric_limits :: is_signed'有什么不利吗? – loop

回答

4

std::is_signed定义如下(表49 - 类型属性谓词,n3485):

is_arithmetic<T>::value && T(-1) < T(0) 

bool是一个组成型[basic.fundamental]/7,因此算术型[basic.fundamental]/8。

bool(x)其中xint,采用布尔转换[conv.bool]/1

算术,无作用域枚举,指针,或指向构件类型的prvalue可以被转换成的prvalue键入bool。零值,空指针值或空成员指针值被转换为false;任何其他值转换为true。 [...]

因此,我们有bool(-1) < bool(0)评估对true < false,这是受(见[expr.rel]/2),以通常的算术转换[EXPR]/10 =>整数提升[conv.prom ]/6

bool类型的prvalue可以转换为int类型的prvalue,与false变为零和true 成为一个。

比较然后读取1 < 0,这是false。检查保证评估为false


在n3797,定影LWG 2197后,检查被定义如下:

如果is_arithmetic<T>::valuetrue,相同的结果integral_constant<bool, T(-1) < T(0)>::value;否则,false

哪一个在T == bool的情况下有相同的结果。

1

从20.9.4.3,表49:

is_arithmetic ::值& & T(-1)< T(0)

那么转换-1时转换成以布尔?当然,1:

零值,空指针值或空成员指针值是 转换为false;任何其他值都将转换为true。

(4。12)

+0

和dyp正确地将转换添加到int我认为理所当然:-)。 –