c++ - C++ 如何检查 std::ios 对象的真值?

标签 c++ casting boolean iostream

当我运行如下代码时

istream s;
if (s)
  // ...

我可以测试 istream(或任何 ios 对象)的真值。根据我的理解,由于 ios 如何定义 operator! 函数,所以它的工作方式如此。 (供引用,http://www.cplusplus.com/reference/ios/ios/operatornot/.)我的问题是:为什么将 s 放在 if 语句中,如上所述,导致 operator! 函数被计算?作为次要问题,如果我将任何对象放入 if 语句中,C++ 将使用哪些可能的方式来评估其真实性?

最佳答案

在 C++03 中,此检查是通过 operator void* 成员函数完成的,如果流处于良好状态,则返回非空指针,否则返回 NULL。由于空指针的计算结果为假,非空指针的计算结果为真,因此该检查工作正常。

不过它确实有问题,因为你可以这样做:

std::cout << std::cout;

这将调用 operator void* 函数并打印出 0 或 cout 的地址,具体取决于流是否良好。这不是一件好事,因为上面的代码似乎没有这样做。更糟糕的是,你可以做

delete std::cout;

如果流不好,这会导致未定义的行为。

在 C++11 中,这发生了变化,因此流有一个 explicit operator bool 成员函数,它允许将流显式转换为 bool。这消除了上述问题,并且是支持对 future 对象进行检查的首选方式。

希望这对您有所帮助!

关于c++ - C++ 如何检查 std::ios 对象的真值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14550813/

相关文章:

java - 无法使用反射从 EJB 内的 Field 转换为 EntityManager

swift - 如何使用 Parse 子类和 User 之间的关系 - Swift

c++ - 含义 std::mutex unlock 与 lock 同步以重新获取

c++ - has_member_of_type - C++ 中的模板元编程

java - 如何比较字符串的百分比?

.net - 为什么我的 boolean 值 0 返回 true?

arrays - Julia中的Array {Bool}和BitArray有什么区别,它们之间有何关系?

c++ - 如何在 RichEdit 2.0 中自动检测 url?

c++ - 通过 2 个不同类型的指针访问缓冲区值

c++ - 转换 c_str() 仅适用于短字符串