принимая во внимание 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
пустой?
Учитывая этот пример кода, мой вопрос: возможно ли, что
(beg != eof)
оцениваетсяtrue
даже еслиfile
пустой?
Стандарт говорит (24.6.1 / 1-2) говорит,
После [
istream_iterator
], и каждый раз++
используется, итератор читает и сохраняет значениеT
, Если итератор не может прочитать и сохранить значениеT
… итератор становится равным конец потока значение итератора. … Два итератора конца потока всегда равны. Итератор конца потока не равен не концу потока
итератор. Два итератора без конца потока равны, если они созданы из одного и того же потока.
Другими словами, это не так лениво, как вы думаете:
istream_iterator<int> beg(file)
Будет читать первый int
, Если файл пуст, он терпит неудачу и сразу становится итератором конца потока.
Других решений пока нет …