26

有谁知道为什么 istream 对象可以用作布尔表达式?例如:

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

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

operator void * ( ) const;

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

4

2 回答 2

24

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

启用了在布尔表达式中使用 istream 或 ostream 以便 C++ 程序员可以继续使用具有副作用的表达式作为whileorfor循环的条件:

SomeType v;

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

程序员这样做并想要那样做的原因是,它提供了更简洁的代码,比……更容易一目了然的代码……</p>

for( ;; )
{
    SomeType v;
    
    stream >> v;
    if( stream.fail() )
    {
        break;
    }
    // ...
}

然而,在某些情况下,即使是这种冗长的结构也可能更可取。这取决于。

于 2011-11-14T05:20:25.100 回答
7

它是给定类型的强制转换运算符。operator T ()是类型 T 的强制转换运算符。在if语句中,将ifstream转换为void*,然后void*转换为bool

于 2011-11-14T05:10:08.253 回答