当我运行如下代码时
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/