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