C ++ InputIterator
是最有限的Iterator概念之一。它只能保证支持取消引用,相等比较,预增量和后增量(以及后增量和取消引用)
因为InputIterator
个对象经常迭代任意流,所以你甚至不能确定在同一个输入上迭代两次会产生相同的值。
我很困惑,如果取消引用运算符operator *
,每次取消引用时都保证返回相同的值,前提是你永远不会增加迭代器。
例如,假设std::begin(some_input_stream)
返回符合InputIterator
概念要求的对象,it
不等于或超过结束位置:
auto it = std::begin(some_input_stream);
auto value1 = *it;
auto value2 = *it;
assert(value1 == value2);
value1
保证与value2
的值相同吗? (当然,提供任何类型的*it
都可以实现理智的相等比较语义)
答案 0 :(得分:9)
value1
保证与value2
的价值相同吗?
是。实际上,您也可以复制迭代器,并保证该副本提供相同的结果,直到增加其中一个迭代器:
auto it2 = it;
auto value3 = *it2;
assert(value3 == value1);
++it2;
auto value4 = *it; // ERROR: might not be dereferencable any more
这由C ++ 11表107(输入迭代器要求)中*a
的要求指定:
如果
a == b
和(a,b)
位于==
的域中,则*a
相当于*b
。
和++r
之后:
以前的
r
值的任何副本都不再需要可解除引用或位于==
的域中。
答案 1 :(得分:0)
我相信它必须奏效。对InputIterator
的要求有效地强制实现缓存最后读取的值,然后由operator*
返回。