Учитывая ленивую оценку istream_iterator
мне было интересно, могу ли я полагаться на инициализированный, но не разыменованный или увеличиваемый, итератор для условия.
В качестве примера:
#include <iostream>
#include <fstream>
#include <iterator>
using namespace std;
int main(void)
{
ifstream file("some_directory");
istream_iterator<int> beg(file), eof;
if (beg != eof) {
//do something
}
else {
cerr << "No Input!" << endl;
}
}
Учитывая этот пример кода, мой вопрос: возможно ли, что (beg != eof)
оценивается true
даже если file
пуст?
Учитывая этот пример кода, мой вопрос: возможно ли, что
(beg != eof)
оцениваетсяtrue
даже еслиfile
пуст?
Нет. В стандарте говорится (24.6.1/1-2):
После того, как [
istream_iterator
] построен, и каждый раз, когда используется++
, итератор считывает и сохраняет значениеT
Если итератору не удается прочитать и сохранить значениеT
..., то итератор становится равным значению итератора конца потока.... Два итератора конца потока всегда равны. Итератор конца потока не равен итератору без конца потока. Два итератора без конца потока равны, когда они построены из одного потока.
Другими словами, это не так лениво, как вы думаете:
istream_iterator<int> beg(file)
Он будет читать первый int
. Если файл пуст, он терпит неудачу и сразу становится итератором конца потока.