istream_iterator和懒惰的评估

时间:2014-02-24 19:21:45

标签: c++ lazy-evaluation istream-iterator

考虑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

1 个答案:

答案 0 :(得分:0)

  

鉴于此代码示例,我的问题是:即使(beg != eof)为空,是否可以true评估file

没有。标准说(24.6.1 / 1-2)说,

  

构造[istream_iterator]之后,每次使用++时,迭代器都会读取并存储值T。如果迭代器无法读取并存储值T ...迭代器将等于 end-of-stream 迭代器值。 ...两个流末端迭代器总是相等的。流结束迭代器不等于非结束流   迭代器。当两个非结束流迭代器从同一个流构造时,它们是相同的。

换句话说,这并不像你想象的那么懒惰:

istream_iterator<int> beg(file)

它会读取第一个int。如果文件为空,则它会失败并立即成为流结束迭代器。