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可以转换为 类型的纯右值int,false变为 0 或true变为 1。
然后比较结果1 < 0为false。该检查保证评估结果为false。
在 n3797 中,修复LWG 2197后,检查定义如下:
如果
is_arithmetic<T>::value是true,则结果与 相同integral_constant<bool, T(-1) < T(0)>::value;否则,false
在 的情况下具有相同的结果T == bool。
| 归档时间: |
|
| 查看次数: |
144 次 |
| 最近记录: |