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
Questa è un'istanza del problema "safe bool".
Ecco un buon articolo: http://www.artima.com/cppsource/safebool.html.
C++ 0x aiuta la situazione con le funzioni di conversione explicit
, così come il cambiamento menzionato da Kristo. Vedi anche Is the safe-bool idiom obsolete in C++11?.
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 inint
.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 conbool
non sono consentite , eliminando alcune fonti di errore utente .
L'ultimo C++ 11 richiede che:
explicit operator bool() const;
See C++ 11 27.5.5.4-1. L '"esplicito" mi sembra strano, però.
'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
Questa risposta è obsoleta. Non è stato standardizzato perché sono state aggiunte funzioni di conversione esplicite. – Potatoswatter