为什么istream对象可以用作bool表达式

Why istream object can be used as a bool expression?

本文关键字:bool 表达式 istream 对象 为什么      更新时间:2023-10-16

有人知道为什么istream对象可以用作bool表达式吗?例如:

ifstream input("tmp");
int iValue;
while (input >> iValue)
    //do something;

这里input >> iValue返回对ifstream对象的引用。我想知道为什么这个对象可以用作bool表达式。
我查看了ifstream类,发现这可能是由于以下成员函数:

operator void * ( ) const;

查看此函数的详细信息。
如果是,谁能给我解释一下这个函数?这个函数的原型不同于通常的操作符重载声明。这个函数的返回类型是什么?
如果不是,那么ifstream对象可以用作bool表达式的原因是什么?
期待您的帮助!

在c++ 11中改变了将istream用作布尔表达式的确切机制。正如你所发现的,以前它是对void*的隐式转换。在c++ 11中,它将explicit转换为bool

允许在布尔表达式中使用istream或ostream,以便c++程序员可以继续使用具有副作用的表达式作为whilefor循环的条件:

SomeType v;
while( stream >> v )
{
    // ...
}

程序员这样做的原因是,它提供了更简洁的代码,代码更容易理解,比例如. ...

for( ;; )
{
    SomeType v;
    
    stream >> v;
    if( stream.fail() )
    {
        break;
    }
    // ...
}
然而,在某些情况下,甚至这样一个冗长的结构也是可取的。这取决于.

这是对给定类型的强制转换操作符。operator T ()是转换为t类型的操作符,在if语句中,ifstream被转换为void*,然后void*被转换为bool