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

时间:2011-11-14 05:07:50

标签: c++ operator-overloading istream

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

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

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

operator void * ( ) const;

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

2 个答案:

答案 0 :(得分:23)

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

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

for

程序员这样做并希望这样做的原因在于,它提供了更简洁的代码,代码更容易一目了然,而不是像...

SomeType v;

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

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

干杯&第h。,

答案 1 :(得分:7)

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