Почему этот код работает?
От: Посторонним В. Беларусь  
Дата: 02.09.07 18:30
Оценка:
Ниже привожу много где мною виденный способ чтентя текстового файла:
std::ifstream f("f:\\temp\\test.txt");
if (!f.is_open() || f.fail())
    return false;
std::string s;
while (std::getline (f, s))
    std::cout << s << "\n";

Код вполне работает, но меня смущает выделенный фрагмент.
По документации std::getline возвращает basic_istream&.
Я вот не пойму как можно ссылку на объект проверять на неноль в цикле while().
Это же не указатель, да и переопределенного оператора вроде operator bool у basic_istream тоже нету.
Никак не пойму.
Re: Почему этот код работает?
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 02.09.07 18:57
Оценка: 2 (1)
Здравствуйте, Посторонним В., Вы писали:

ПВ>Ниже привожу много где мною виденный способ чтентя текстового файла:

ПВ>
ПВ>std::ifstream f("f:\\temp\\test.txt");
ПВ>if (!f.is_open() || f.fail())
ПВ>    return false;
ПВ>std::string s;
ПВ>while (std::getline (f, s))
ПВ>    std::cout << s << "\n";
ПВ>

ПВ>Код вполне работает, но меня смущает выделенный фрагмент.
ПВ>По документации std::getline возвращает basic_istream&.
ПВ>Я вот не пойму как можно ссылку на объект проверять на неноль в цикле while().
ПВ>Это же не указатель, да и переопределенного оператора вроде operator bool у basic_istream тоже нету.
ПВ>Никак не пойму.

В basic_ios определен operator void*()
Re: Почему этот код работает?
От: WolfHound  
Дата: 02.09.07 19:01
Оценка: 2 (1)
Здравствуйте, Посторонним В., Вы писали:

ПВ>Это же не указатель, да и переопределенного оператора вроде operator bool у basic_istream тоже нету.

Зато у basic_ios есть operator void*()
Смотри писание 27.4.4.3 и 27.6.1.1
... << RSDN@Home 1.2.0 alpha rev. 673>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re: Почему этот код работает?
От: Ужасть бухгалтера  
Дата: 02.09.07 19:02
Оценка: 2 (1)
Здравствуйте, Посторонним В., Вы писали:

ПВ>Код вполне работает, но меня смущает выделенный фрагмент.

ПВ>По документации std::getline возвращает basic_istream&.
ПВ>Я вот не пойму как можно ссылку на объект проверять на неноль в цикле while().
ПВ>Это же не указатель, да и переопределенного оператора вроде operator bool у basic_istream тоже нету.
ПВ>Никак не пойму.

Посмотрел в STLport — у basic_istream есть оператор bool. Также у базового класса (ios_base) есть оператор void* (), что тоже может быть причиной корректного приведения к NULL.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.