gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 20:28:00 25 4
gpt4 key购买 nike

当我运行如下代码时

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com