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?
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:
- std :: basic_ios :: operator void * () documentación en el sitio cppreference,
- El The Safe Bool Idiom artículo sobre artima ,
- C ++ FAQ lite & # 167; 15.4 ,
- la norma, ...
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.