2011-11-14 39 views
20

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

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

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

operator void * () const; 

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

cheng

+0

好问的问题,尽管有一个直截了当的回答。 –

+0

因为C++ 11实际上有'显式运算符bool()' –

回答

20

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

然而,在某些情况下,即使是如此详细的结构也是可取的。这取决于。

干杯&心连心,

5

它是给定类型的一个演员操作符。 operator T()是类型T的演员。在if声明中,ifstream转换为void*,然后void*转换为bool

+4

'void *转换为bool' ..这是不正确的。相反,我会说,'void *与0相比较。 – iammilind

+0

非常感谢您的回复,我明白了。我还有一个问题:如果在一个类中有两个转换运算符函数,一个转换为int,另一个转换为int *。对于调用if(obj),将调用哪个操作函数?为什么?谢谢。 – cheng

+4

@iammilind:这是正确的。指针被转换为“bool”。检查§4.12和§6.4.1。 –