2009-08-26 10 views
9

In this answer Parlo dell'utilizzo di una conversione dell'oggetto std::ifstream in bool per verificare se lo streaming è ancora in buono stato. Ho cercato nel libro di Josuttis ulteriori informazioni (p. 600 se sei interessato), e si scopre che gli oggetti iostream in realtà sovraccaricano operator void*. Restituisce un puntatore nullo quando il flusso è danneggiato (che può essere convertito implicitamente in false) e un puntatore non nullo altrimenti (convertito implicitamente in true). Perché non sovraccaricano solo lo operator bool?Perché gli oggetti iostream non sovraccaricano l'operatore bool?

risposta

13

Sembra che la sezione standard C++ 0x 27.4.4.3 abbia la risposta (sottolineatura mia).

operator unspecified-bool-type() const; 

Ritorni: Se fail() poi un valore che valuterà falsa in un valore booleano contesto; altrimenti un valore che sarà valutare true in un contesto booleano. Il tipo di valore restituito non deve essere trasformabile in int.

Nota: Questa conversione può essere utilizzato in contesti in cui un bool è previsto (ad esempio, una condizione if); tuttavia, le conversioni implicite (ad esempio, a) che possono verificarsi con bool non sono consentite , eliminando alcune fonti di errore utente .

+0

Questa risposta è obsoleta. Non è stato standardizzato perché sono state aggiunte funzioni di conversione esplicite. – Potatoswatter

-1

L'ultimo C++ 11 richiede che:

explicit operator bool() const; 

See C++ 11 27.5.5.4-1. L '"esplicito" mi sembra strano, però.

+1

'explicit' è il motivo per cui è stato aggiunto. Una funzione di conversione 'esplicita 'come questa si applica solo se è la * sola * conversione, in questo caso converte' iostream' in 'bool' ma non in' int' tramite una conversione intermedia di 'bool'. Leggi le altre risposte su questa pagina per conoscere Safe Bool Idiom. – Potatoswatter

Problemi correlati