dyp*_*dyp 4

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

is_arithmetic<T>::value && T(-1) < T(0)
Run Code Online (Sandbox Code Playgroud)

bool是整数类型 [basic.fundamental]/7,因此是算术类型 [basic.fundamental]/8。

bool(x)其中x是 an int,使用布尔转换 [conv.bool]/1

算术、无范围枚举、指针或指向成员类型的指针的纯右值可以转换为 类型的纯右值bool。零值、空指针值或空成员指针值将转换为false; 任何其他值都会转换为true. [...]

所以我们bool(-1) < bool(0)评估true < false,它受通常算术转换 [expr]/10 => 积分提升 [conv.prom]/6 的影响(参见 [expr.rel]/2)

类型的纯右值bool可以转换为 类型的纯右值intfalse变为 0 或true 变为 1。

然后比较结果1 < 0false。该检查保证评估结果为false


在 n3797 中,修复LWG 2197后,检查定义如下:

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

在 的情况下具有相同的结果T == bool