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

问题描述 投票:23回答:2

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

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

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

operator void * ( ) const;

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

c++ operator-overloading istream
2个回答
23
投票

在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;
    }
    // ...
}

然而,在某些情况下,甚至这种冗长的结构也是优选的。这取决于。

干杯&hth。,


7
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.