istream_iterator cin初始化等待输入

时间:2012-09-26 13:17:36

标签: c++ istream-iterator

我有这段代码。 istream_iterator对象只是定义而不是使用,所以我希望它不会做任何事情,应用程序会立即完成。但是当我运行应用程序时,在我提供一些输入之前它将无法完成。为什么呢?

我正在使用以下命令在ArchLinux上编译它:gcc 4.7.1,带命令: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 个答案:

答案 0 :(得分:4)

按照标准,

  

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

istream_iterator(istream_type& s);
     

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

因此未指定该程序是否会等待输入。

然而,很难看出istream_iterator如何以其他方式实施;每24.6.1:1,构造后,迭代器读取并存储值T ,因此如果在构造中没有发生读取则需要发生在operator *() const和免费的operator==(const istream_iterator<T> &, const istream_iterator<T> &)上,因此迭代器的所有内部状态都必须是mutable

答案 1 :(得分:3)

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

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

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

并且没有阻塞。

答案 2 :(得分:2)

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

答案 3 :(得分: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;
}