2011-11-14 14 views
20

Qualcuno sa perché l'oggetto istream può essere usato come espressione bool? Per esempio:Perché l'oggetto istream può essere usato come espressione bool?

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

Qui input >> iValue restituisce un riferimento all'oggetto ifstream. Voglio sapere perché questo oggetto può essere usato come espressione bool.
Guardo nella classe ifstream e scoprire che questo può essere dovuto al seguente funzione membro:

operator void * () const; 

Vedi here per i dettagli su questa funzione.
Se lo è, qualcuno può spiegarmi questa funzione? Il prototipo di questa funzione è diverso dalla normale dichiarazione di sovraccarico dell'operatore. Qual è il tipo di ritorno di questa funzione?
Se non lo è, qual è la ragione per cui l'oggetto ifstream può essere usato come espressione bool?
In attesa del vostro aiuto!

cheng

+0

Bene ha fatto la domanda, pur avendo una risposta dritto in avanti. –

+0

Dato che C++ 11 esiste effettivamente 'esplicito bool operatore()' –

risposta

20

L'esatto meccanismo che consente l'uso di un istream come espressione booleana, è stato modificato in C++ 11. In precedenza è stata una conversione implicita in void*, come hai trovato. In C++ 11 è invece una conversione explicit in bool.

L'utilizzo di un istream o ostream in un'espressione booleana è stato abilitato in modo che C++ i programmatori potrebbero continuare ad utilizzare un'espressione con effetti collaterali come la condizione di un ciclo while o for:

SomeType v; 

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

E il motivo per cui i programmatori lo fanno e lo vogliono, è che fornisce un codice più conciso, codice che è più facile da capire a colpo d'occhio, rispetto ad esempio & Hellip;

for(;;) 
{ 
    SomeType v; 

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

Tuttavia, in alcuni casi, anche una tale struttura verbosa può essere preferibile. Dipende.

Acclamazioni & hth.,

5

È un operatore di trasmissione per il tipo specificato. operator T() è un operatore di trasmissione per il tipo T. Nell'istruzione if, lo ifstream viene convertito in void* e quindi void* convertito in bool.

+4

'void * convertito in bool' .. non è corretto. Piuttosto, direi, void * è paragonato a 0'. – iammilind

+0

Grazie per aver risposto così presto, ho capito. Ho ancora una domanda: se ci sono due funzioni di operatore cast in una classe, una in int e l'altra in int *. Per la chiamata if (obj), quale funzione di operazione del caso verrà chiamata? Perché? Grazie. – cheng

+4

@iammilind: è corretto. Il puntatore viene convertito in 'bool'. Controllare §4.12 e §6.4.1. –

Problemi correlati