1

考虑到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)评估?truefile

4

1 回答 1

1

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

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

[ istream_iterator] 构造完成后,每次++使用时,迭代器都会读取并存储 的值T。如果迭代器未能读取和存储T...的值,则迭代器将等于流结束迭代器的值。... 两个流尾迭代器总是相等的。流结束迭代器不等于非流结束迭代器。当从同一个流构造时,两个非流结束迭代器是相等的。

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

istream_iterator<int> beg(file)

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

于 2014-02-24T19:29:29.893 回答