【问题标题】:Why don't iostream objects overload operator bool?为什么 iostream 对象不重载运算符 bool?
【发布时间】:2010-11-23 00:29:44
【问题描述】:

this answer 中我讲了使用std::ifstream 对象转换为bool 来测试流是否仍然处于良好状态。我查看了 Josuttis 的书以获取更多信息(如果您有兴趣,请参阅第 600 页),结果发现iostream 对象实际上重载了operator void*。当流坏时它返回一个空指针(可以隐式转换为false),否则返回一个非空指针(隐式转换为true)。他们为什么不直接超载operator bool

【问题讨论】:

    标签: c++ operator-overloading iostream


    【解决方案1】:

    看起来 C++0x 标准第 27.4.4.3 节有答案(强调我的)。

    operator unspecified-bool-type() const;
    

    返回:如果fail(),那么一个值 将在布尔值中评估 false 语境;否则将是一个值 在布尔上下文中评估 true。 返回的值类型不得为 可转换为int

    注意:此转换可用于 预期 bool 的上下文 (例如,if 条件);然而, 隐式转换(例如,到 intbool 可能发生的情况不是 允许,消除一些来源 用户错误。

    【讨论】:

    • 这个答案已经过时了。它没有标准化,因为添加了显式转换函数。
    【解决方案2】:

    这是“安全布尔”问题的一个实例。

    这是一篇好文章:http://www.artima.com/cppsource/safebool.html

    C++0x 通过explicit 转换函数以及 Kristo 提到的更改来帮助解决这种情况。另见Is the safe-bool idiom obsolete in C++11?

    【讨论】:

      【解决方案3】:

      最新的 C++11 要求:

      explicit operator bool() const;
      

      参见 C++11 27.5.5.4-1。不过,“显式”对我来说似乎很奇怪。

      【讨论】:

      • explicit 是添加它的原因。像这样的explicit 转换函数仅适用于only 转换,在这种情况下,它将通过中间@987654327 将iostream 转换为bool,但不会转换为int @ 转换。阅读此页面上的其他答案以了解安全布尔成语。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-02-09
      • 2020-03-03
      • 2012-11-26
      • 2012-04-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多