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
- 1. Perché iostream include time.h?
- 2. Operatori che sovraccaricano in C++
- 3. NSAray pieno di oggetti bool
- 4. Perché il mio "operatore esplicito bool()" non è chiamato?
- 5. iostream non trovato in Xcode
- 6. clang iostream - simbolo non trovato
- 7. Impossibile includere iostream in Android perché?
- 8. Perché booleano E bool
- 9. perché il confronto Javascript non funziona con gli oggetti?
- 10. Perché gli oggetti std :: atomic non sono copiabili?
- 11. Perché gli oggetti immutabili sono thread-safe?
- 12. Perché gli oggetti restituiti da bind ignorano gli argomenti extra?
- 13. uint8_t comportamento iostream
- 14. Operatori che sovraccaricano per enumerazione
- 15. Perché bool (xml.etree.ElementTree.Element) restituisce False?
- 16. C++ - Inclusione non risolta: <iostream>
- 17. File "iostream" non trovato in Xcode 4.2
- 18. CDI con gli oggetti non gestiti
- 19. Perché non posso usare builtin per le classi che sovraccaricano il sottorequ?
- 20. Perché BOOL è un carattere firmato?
- 21. Perché non riesco a estendere il bool in Python?
- 22. #include iostream in C?
- 23. Invariant Violazione: Gli oggetti non sono validi come React bambino (per gli oggetti nidificati)
- 24. Overloaded Bool/String Ambiguity
- 25. perché gli oggetti di dettatura sono inattuabili in python?
- 26. Perché Contains confronta gli oggetti in modo diverso da ==?
- 27. Perché gli oggetti lanciati devono essere inizializzati in copia?
- 28. Perché gli oggetti Java devono essere multipli di 8?
- 29. Perché l'ordine dei metodi LINQ per gli oggetti conta
- 30. Perché gli oggetti di trasferimento devono implementare Serializable?
Questa risposta è obsoleta. Non è stato standardizzato perché sono state aggiunte funzioni di conversione esplicite. – Potatoswatter