2010-11-27 3 views
9
#include <iostream> 
#include <fstream> 

using namespace std; 

int main() 
{ 

    ifstream file0("file0.txt"); 
    ifstream file1("file1.txt"); 

    if (file0 != file1) { 
     cout << "What is being compared?" << endl; 
    } 

} 

Si el código anterior, ¿qué se compara en el condicional? Creo que son valores de puntero, pero no puedo encontrar evidencia de respaldo.! = Operador y secuencias de archivos

Gracias!

+0

Un paso hacia "los indicadores se están comparando" se puede tomar probando la igualdad. No debería cout. – Tom

Respuesta

4

Al hacer una comparación en un ifstream, se llamará al operator void*. Si está utilizando Visual Studio, puede ver esto si elige ver el desmontaje del código.

El operador se puede encontrar here. Como se puede ver se ha mencionado:

El puntero devuelto no está destinada a hacer referencia, sólo se indica el éxito cuando se configuran ninguno de los indicadores de error.

De modo que si ambos Ifstreams fallan, serán iguales. Si tienen éxito (aunque no estoy seguro de dónde proviene el valor del puntero) serán no iguales [esto se ha probado en VS].

+1

Digamos, ¿cómo sabe el compilador elegir el operador void *() sobre el operador bool()? ¿Qué define la precedencia? – chrisaycock

+0

@chris: en realidad estaba pensando en lo mismo. Eso está más allá de mi conocimiento sin embargo .. – Default

+2

Las corrientes no tienen un 'operador bool'. El 'void *' devuelto es implícitamente convertible a bool en contextos booleanos ('if (std :: cin) ...'). – UncleBens