c++ - identificador - std:: getline() regresa
getline parameters in c++ (4)
Tengo un ciclo que lee cada línea en un archivo usando getline ().
istream is;
string line;
while (!getline(is, line).eof())
{
}
Noté que llamar a getline () como este también parece funcionar:
while (getline(is, line))
¿Que está pasando aqui? 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 apegarme a la primera forma?
Me quedaría con la primera forma. Si bien la segunda forma puede funcionar, no es muy explícita. Su código original describe claramente qué se está haciendo y cómo se espera que se comporte.
Actualizado:
He señalado erróneamente la documentación basic_istream para el método operator 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 es el operador void * () el que recibe la llamada. Más sobre esto en C ++ FAQ .
El istream devuelto por getline () tiene su operador void * () llamado implícitamente método, que devuelve si la secuencia se ha ejecutado en un error. Como tal, está haciendo más comprobaciones que una llamada a eof ().
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 de 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 artículo The Safe Bool Idiom sobre artima,
- C ++ FAQ lite §15.4 ,
- el estandar, ...
De lo contrario, como ya han dicho otros, prefiera la segunda forma que es canónica. Use not fail()
si realmente quiere un código detallado: nunca recuerdo si xxx.good()
se puede usar en lugar de !xxx.fail()