Подтвердить что ты не робот

Std:: getline() возвращает

У меня есть цикл, который читает каждую строку в файле с помощью getline().

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

Я заметил, что вызов getline(), подобного этому, также работает:

while (getline(is, line))

Что здесь происходит? getline() возвращает ссылку на поток. Это как-то преобразуется в указатель? Это действительно хорошая практика или я должен придерживаться первой формы?

4b9b3361

Ответ 1

Исход, возвращаемый функцией getline(), имеет неявный вызов оператора void *(), который возвращает ли поток в ошибку. Таким образом, он делает больше проверок, чем вызов eof().

Ответ 2

Обновлено:

Я ошибочно указал на документацию basic_istream для метода bool() оператора в классе basic_istream:: sentry, но так же, как это было отметил, что это не то, что происходит. Я голосовал за Чарльза и Люка за правильные ответы. Фактически оператор void *() вызывает вызов. Подробнее об этом в часто задаваемых вопросах С++.

Ответ 3

Чарльз действительно дал правильный ответ.

То, что называется действительно std::basic_ios::operator void*(), а не sentry::operator bool(), которое согласуется с тем, что std::getline() возвращает a std::basic_istream (таким образом, a std::basic_ios), а не часовой.

Для неверующих см.:

В противном случае, как уже говорили другие, предпочитайте вторую форму, которая является канонической. Используйте не fail(), если действительно нужен подробный код. Я никогда не помню, можно ли использовать xxx.good() вместо !xxx.fail()

Ответ 4

Я бы придерживался первой формы. В то время как вторая форма может работать, она вряд ли очевидна. В вашем исходном коде четко описывается, что делается и как оно должно вести себя.