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

0

Учитывая ленивую оценку 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 пуст?

  • 0
    Нет, нет
Теги:
lazy-evaluation
istream-iterator

1 ответ

0
Лучший ответ

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

Нет. В стандарте говорится (24.6.1/1-2):

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

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

istream_iterator<int> beg(file)

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню