4

I've got this code snippet. The istream_iterator object is only defined and not used, so I expect that it won't do anything and application finish immediately. But when I run application, it will not finish before I provide some input. Why?

I'm compiling it on ArchLinux with: gcc 4.7.1, with command: g++ -std=c++11 filename.cpp

#include <iterator>
#include <iostream>

using namespace std;

int main(int argc, char *argv[])
{
    istream_iterator<char> input(cin);

    return 0;
}
4

4 回答 4

4

按照标准,

24.6.1.1 istream_iterator 构造函数和析构函数 [istream.iterator.cons]

istream_iterator(istream_type& s);

3 -效果:用. value可以在构造期间或第一次被引用时初始化。&s

所以不确定这个程序是否会等待输入。

但是,很难看出如何istream_iterator以其他方式实现;根据 24.6.1:1,在构造之后 [...] 迭代器读取并存储 的值T,因此如果在构造时没有读取,那么它需要operator *() const在 free 上和上发生operator==(const istream_iterator<T> &, const istream_iterator<T> &),所以所有迭代器的内部状态必须是mutable.

于 2012-09-26T13:23:29.533 回答
3

据推测,istream 迭代器将立即调用cin >> x以提取第一个标记并确定它是否应该与结束迭代器相等。提取操作会一直阻塞,直到流关闭、提取令牌或遇到解析失败。

请注意,您的问题标题是错误的:您不仅声明 input了,而且还定义了它。如果您的代码要准确反映问题,它会说

extern istream_iterator<char> input;  // declaration only!

并且不会有阻塞。

于 2012-09-26T13:19:47.113 回答
2

从流中,您只能“获取”每个值一次,之后它就消失了。然而,迭代器的一个常见需求是多次访问一个值而不增加迭代器。因此,istream_iterator将在构造时提取第一个值并将其复制到一个内部值中,然后在取消引用迭代器时返回该值。这也允许迭代器确定它是否在输入的末尾并成为结束迭代器。在递增时,然后读取下一个值。

于 2012-09-26T13:22:12.633 回答
0

尝试这个:

#include <iostream>
#include <iterator>

using namespace std;

int main()
{
    istream_iterator<int> start(cin);
    istream_iterator<int> itend;

    while( start != itend ) {
        cout << *start << endl;
        start++;
        //Press Enter followed by Control-D on linux to exit the loop
    }

    cout<<"Control-D Pressed "<<endl;
    return 0;
}

于 2019-10-22T11:32:11.030 回答