Jef*_*eff 4 c++ iostream casting boolean
当我运行代码时
istream s;
if (s)
  // ...
我可以测试 istream(或任何 ios 对象)的真值。根据我的理解,这是因为 ios 定义operator!函数的方式。(供参考,http://www.cplusplus.com/reference/ios/ios/operatornot/。)我的问题是:为什么将sif 语句放入上面,导致operator!函数被评估?作为第二个问题,如果我在 if 语句中只放入任何对象,C++ 将使用哪些可能的方法来评估其真实性?
在 C++03 中,此检查是通过operator void*成员函数完成的,如果流处于良好状态,则返回非空指针,否则返回 NULL。由于空指针的计算结果为 false,非空指针的计算结果为 true,因此此检查工作正常。
但是,它确实存在问题,因为您可以这样做:
std::cout << std::cout;
这将调用该operator void*函数并打印出 0 或 的地址cout,具体取决于流是否良好。这不是一件好事,因为上面的代码似乎没有这样做。更糟糕的是,你可以这样做
delete std::cout;
如果流不好,这会导致未定义的行为。
在 C++11 中,这被改变了,所以流有一个explicit operator bool成员函数,它允许流被显式地转换为 bool。这消除了上述问题,并且是支持 if 检查前进的首选方式。
希望这可以帮助!
| 归档时间: | 
 | 
| 查看次数: | 978 次 | 
| 最近记录: |