istream_iterator и ленивая оценка

принимая во внимание istream_iterator«s ленивая оценка Мне было интересно, могу ли я полагаться на инициализированный, но никогда не разыменованный или инкрементный итератор для условия.

В качестве примера:

#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 пустой?

0

Решение

Учитывая этот пример кода, мой вопрос: возможно ли, что (beg != eof) оценивается true даже если file пустой?

Стандарт говорит (24.6.1 / 1-2) говорит,

После [istream_iterator], и каждый раз ++ используется, итератор читает и сохраняет значение T, Если итератор не может прочитать и сохранить значение T … итератор становится равным конец потока значение итератора. … Два итератора конца потока всегда равны. Итератор конца потока не равен не концу потока
итератор. Два итератора без конца потока равны, если они созданы из одного и того же потока.

Другими словами, это не так лениво, как вы думаете:

istream_iterator<int> beg(file)

Будет читать первый int, Если файл пуст, он терпит неудачу и сразу становится итератором конца потока.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]