Por que o object istream pode ser usado como expressão booleana?

Alguém sabe porque o object istream pode ser usado como expressão bool? Por exemplo:

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

Aqui input >> iValue retorna uma referência ao object ifstream. Eu quero saber por que esse object pode ser usado como uma expressão bool.
Eu olho para a class ifstream e acho que isso pode ser devido à seguinte function de membro:

 operator void * ( ) const; 

Veja aqui detalhes sobre esta function.
Se for, alguém pode explicar essa function para mim? O protótipo desta function é diferente da declaração de sobrecarga do operador. Qual é o tipo de retorno desta function?
Se não for, então qual é a razão pela qual o object ifstream pode ser usado como expressão bool?
Mal posso esperar pela sua ajuda!

cheng

O mecanismo exato que permite o uso de um istream como uma expressão booleana foi alterado em C ++ 11. Anteriormente, era uma conversão implícita para void* , como você descobriu. Em C ++ 11, é uma conversão explicit para bool .

O uso de um istream ou ostream em uma expressão booleana foi ativado para que os programadores de C ++ pudessem continuar a usar uma expressão com efeitos colaterais como a condição de um while ou loop:

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

E a razão pela qual os programadores fazem isso e querem isso, é que ele fornece um código mais conciso, código que é mais fácil de ler de relance do que por exemplo…

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

No entanto, em alguns casos, mesmo essa estrutura detalhada pode ser preferível. Depende.

Cheers & hth.

É um operador de casting para o tipo dado. operator T () é um operador de conversão para o tipo T. Na instrução if , o ifstream é convertido em void* e, em seguida, o void* convertido em bool .