2011-11-14 12 views
20

¿Alguien sabe por qué el objeto istream se puede usar como expresión bool? Por ejemplo:¿Por qué el objeto istream se puede usar como una expresión bool?

ifstream input("tmp"); 
int iValue; 
while (input >> iValue) 
    //do something; 

Aquí input >> iValue devuelve una referencia al objeto ifstream. Quiero saber por qué este objeto se puede usar como una expresión bool.
miro en la clase ifstream y encontrar que esto puede deberse a la siguiente función miembro:

operator void * () const; 

Ver here para los detalles acerca de esta función.
Si es así, ¿alguien puede explicarme esta función? El prototipo de esta función es diferente de la declaración de sobrecarga del operador habitual. ¿Cuál es el tipo de devolución de esta función?
Si no es así, ¿cuál es la razón por la que el objeto ifstream se puede usar como expresión bool?
¡Esperamos su ayuda!

cheng

+0

Bien hizo la pregunta a pesar de tener una respuesta directa. –

+0

Desde C++ 11 existe en realidad 'operador explícito bool()' –

Respuesta

20

El mecanismo exacto que permite el uso de una istream como expresión booleana, se modificó en C++ 11. Anteriormente, se trataba de una conversión implícita a void*, como ha encontrado. En C++ 11 es en cambio una conversión de explicit a bool.

El uso de un istream o ostream en una expresión booleana fue habilitado para que los programadores de C++ podrían seguir utilizando una expresión con efectos secundarios como la condición de un bucle while o for:

SomeType v; 

while(stream >> v) 
{ 
    // ... 
} 

Y La razón por la que los programadores hacen eso y quieren eso es que brinda un código más conciso, un código que es más fácil de asimilar de un vistazo que, por ejemplo, & hellip;

for(;;) 
{ 
    SomeType v; 

    stream >> v; 
    if(stream.fail()) 
    { 
     break; 
    } 
    // ... 
} 

Sin embargo, en algunos casos incluso una estructura tan prolija puede ser preferible. Depende.

Saludos & HTH.,

5

Es un operador de yeso para el tipo especificado. operator T() es un operador de conversión al tipo T. En la instrucción if, el ifstream se convierte en void* y luego el void* se convirtió en bool.

+4

'void * convertido a bool' .. eso no es correcto. Más bien diría, 'void * se compara con 0'. – iammilind

+0

Gracias por responder tan pronto, lo tengo. Tengo una pregunta más: si hay dos funciones de operador de conversión en una clase, una a int y la otra a int *. Para la llamada if (obj), ¿qué función de operación de caso se llamará? ¿Por qué? Gracias. – cheng

+4

@iammilind: Es correcto. El puntero se convierte en 'bool'. Ver §4.12 y §6.4.1. –

Cuestiones relacionadas