2009-08-26 15 views
9

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

13

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 a int.

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 con bool no están permitidas , eliminando algunas fuentes de error de usuario.

+0

Esta respuesta es obsoleta. No fue estandarizado porque se agregaron funciones de conversión explícitas. – Potatoswatter

-1

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.

+1

'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

Cuestiones relacionadas