En this answer hablo sobre el uso de la conversión de un objeto std::ifstream
a bool
para comprobar si la transmisión todavía está en buen estado. Busqué en el libro de Josuttis más información (p.600 si está interesado), y resulta que los objetos iostream
realmente sobrecargaron operator void*
. Devuelve un puntero nulo cuando la secuencia es incorrecta (que se puede convertir implícitamente a false
), y un puntero no nulo en caso contrario (implícitamente convertido a true
). ¿Por qué no solo sobrecargan operator bool
?¿Por qué iostream no sobrecarga el operador de bool?
Respuesta
Esta es una instancia del problema "bool seguro".
Aquí hay un buen artículo: http://www.artima.com/cppsource/safebool.html.
C++ 0x ayuda a la situación con las funciones de conversión explicit
, así como el cambio que Kristo menciona. Vea también Is the safe-bool idiom obsolete in C++11?.
Parece que la sección estándar de C++ 0x 27.4.4.3 tiene la respuesta (énfasis mío).
operator unspecified-bool-type() const;
devoluciones: Si
fail()
continuación, un valor que evaluará falso en un contexto booleano ; de lo contrario, un valor que será evaluará verdadero en un contexto booleano. El tipo de valor devuelto no debe ser convertible aint
.Nota: Esta conversión se puede utilizar en contextos donde se espera (por ejemplo, un si la condición) un
bool
; sin embargo, conversiones implícitas (por ejemplo,int
) que pueden ocurrir conbool
no están permitidas , eliminando algunas fuentes de error de usuario.
El último C++ 11 requiere que:
explicit operator bool() const;
Ver C++ 11 27.5.5.4-1. Sin embargo, el 'explícito' me parece extraño.
'explicit' es la razón por la que se agregó. Una función de conversión "explícita" como esta solo se aplicará si es la conversión * solo *, en este caso convertirá 'iostream' en' bool' pero no en 'int' mediante una conversión' bool' intermedia. Lea las otras respuestas en esta página para obtener más información sobre Safe Bool Idiom. – Potatoswatter
- 1. sobrecarga de conversión no miembros a bool operador
- 2. Operador de comparación sobrecarga
- 3. Operador sobrecarga = como No miembro
- 4. C++ operador == sobrecarga
- 5. ¿Por qué iostream incluye time.h?
- 6. ¿Por qué no puedo usar dos ptrs en la sobrecarga del operador?
- 7. ¿Por qué anular el operador()?
- 8. ¿Cuándo sobrecarga el operador nuevo?
- 9. operador [] = ¿sobrecarga?
- 10. ¿Por qué no hay operadores de cortocircuito elevados en `bool?`?
- 11. Sobrecarga + Operador con plantillas
- 12. Sobrecarga del operador
- 13. operador explícita de error bool
- 14. define el operador void * y el operador bool
- 15. ¿Por qué sobrecargar verdadero y falso en lugar de definir el operador bool?
- 16. C# en el operador-sobrecarga
- 17. ¿Por qué F # no proporciona una sobrecarga personalizada para el operador ==?
- 18. ¿Por qué C# no admite la sobrecarga del operador con pase por referencia?
- 19. C++ menos sobrecarga del operador, ¿qué manera de usar?
- 20. ¿Por qué no puedes sobrecargar el '.' operador en C++?
- 21. No se puede incluir iostream en android por qué?
- 22. Operador = sobrecarga en C++
- 23. operador de negación unaria sobrecarga en D
- 24. Sobrecarga del operador de flujo
- 25. "No puede reenviar clases declarar que sobrecarga el operador &"?
- 26. Operador sobrecarga == versus Igual()
- 27. Por qué el operador = devuelve la referencia no const referencia
- 28. ¿Sobrecarga del operador?
- 29. F # (.. ..) operador uso/sobrecarga
- 30. Dart support operador sobrecarga
Esta respuesta es obsoleta. No fue estandarizado porque se agregaron funciones de conversión explícitas. – Potatoswatter