我有这段代码。 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;
}
答案 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;
}