【问题标题】:Is std::is_signed<bool>::value guaranteed to return false?std::is_signed<bool>::value 是否保证返回 false?
【发布时间】:2014-03-24 21:01:50
【问题描述】:

我知道std::numeric_limits&lt;bool&gt;::is_signed 总是错误的,但std::is_signed&lt;bool&gt;::value 也是如此吗?谢谢

【问题讨论】:

  • 显然是那些文档。正在寻找标准报价?
  • 有趣的问题。 bool是整数类型,因此是算术类型,而is_signed是基于检查is_arithmetic&lt;T&gt;::value &amp;&amp; T(-1) &lt; T(0)
  • @Yakk 是的,您可以提供任何支持。如果在std::is_signed&lt;bool&gt;::value 中不能保证,那么在我的模板中测试std::numeric_limits&lt;bool&gt;::is_signed 有什么缺点吗?

标签: c++ boolean signed


【解决方案1】:

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

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

所以我们将bool(-1) &lt; bool(0) 评估为true &lt; false,这是(参见[expr.rel]/2)通常算术转换[expr]/10 => 积分提升[conv.prom]/6

bool 类型的纯右值可以转换为int 类型的纯右值,false 变为零,true 合而为一。

然后比较读取1 &lt; 0,即false。该检查保证评估为false


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

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

T == bool 的结果相同。

【讨论】:

    【解决方案2】:

    从 20.9.4.3 开始,表 49:

    is_arithmetic::value && T(-1)

    那么,当转换为布尔值时,-1 的含义是什么?当然,1:

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

    (4.12)

    【讨论】:

    • 并且 dyp 正确地将转换添加到我认为理所当然的 int :-)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-03
    • 1970-01-01
    相关资源
    最近更新 更多