std::cin
下面的代码片段从;中读取三个整数。它写入两个numbers
并丢弃第三个:
std::vector<int> numbers(2);
copy_n(std::istream_iterator<int>(std::cin), 2, numbers.begin());
我希望代码从 中准确读取两个整数std::cin
,但事实证明这是一个正确的、符合标准的行为。这是对标准的疏忽吗?这种行为的基本原理是什么?
从 C++03 标准中的 24.5.1/1 开始:
构造完成后,每次使用 ++ 时,迭代器都会读取并存储
T
.
所以在上面的代码中,流迭代器在调用点已经读取了一个整数。从那时起,算法中迭代器的每次读取都是预读,产生从前一次读取缓存的值。
下一个标准的最新草案n3225在这里似乎没有任何变化(24.6.1/1)。
在相关说明中,当前标准的 24.5.1.1/2 参考istream_iterator(istream_type& s)
构造函数读取
in_stream
效果:用 初始化s
。value
可以在构造期间或第一次被引用时初始化。
强调“value
可能被初始化......”而不是“应被初始化”。这听起来与 24.5.1/1 相矛盾,但也许这值得自己提出一个问题。