problemas identificador funciona está dev definido con c++ getline

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:

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()