Pregunta

Tengo un bucle que lee cada línea en un archivo usando getline () :

istream is;
string line;
while (!getline(is, line).eof())
{
    // ...
}

Me di cuenta de que llamar a getline () de esta manera también parece funcionar:

while (getline(is, line))

¿Qué está pasando aquí? getline () devuelve una referencia de flujo. ¿Se está convirtiendo en un puntero de alguna manera? ¿Es esto realmente una buena práctica o debería seguir con el primer formulario?

¿Fue útil?

Solución

El istream devuelto por getline () tiene su operador void * () llamado implícitamente, lo que devuelve si la secuencia se ha ejecutado en un error Como tal, realiza más comprobaciones que una llamada a eof () .

Otros consejos

Actualizado :

Había señalado por error el documentación de basic_istream para el método del operador bool () en la clase basic_istream :: sentry, pero como se ha señalado, esto no es realmente lo que está sucediendo. He votado las respuestas correctas de Charles y Luc. En realidad, se llama al operador void * (). Más sobre esto en las Preguntas frecuentes de C ++ .

Charles dio la respuesta correcta .

Lo que se llama es de hecho std :: basic_ios :: operator void * () , y no sentry :: operator bool () , que es consistente con el hecho que std :: getline () devuelve un std :: basic_istream (por lo tanto, un std :: basic_ios ), y no un centinela.

Para los no creyentes, ver:

De lo contrario, como ya han dicho otros, prefiera la segunda forma que es canónica. Use not fail () si realmente desea un código detallado; nunca recuerdo si se puede usar xxx.good () en lugar de ! Xxx.fail ( )

Me quedaría con la primera forma. Si bien la segunda forma puede funcionar, no es explícita. Su código original describe claramente lo que se está haciendo y cómo se espera que se comporte.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top