根据cppreference(std::ranges::range):
语义要求
给定一个表达式 E,使得 decltype((E)) 为
,T
模型T
仅当range
- ...
- ranges::begin(E) 和 ranges::end(E) 都是摊销常数时间,并且不会以可观察到等式保持表达式的方式改变 E 的值,并且
但是要求对于单遍范围,函数
ranges::begin(E)
是摊销常数时间是否合理?事实上,对于这样的范围,方法 E.begin()
实际上将包含对 E.get_next_value()
之类的调用。因此,如果 E
不是预定义元素的集合(例如,如果 E
是流或 E
就像流),则无法满足上述要求。
但是要求对于单遍范围,函数 range::begin(E) 是摊销常数时间是否合理?
是的。摊余常数时间并不意味着“速度极快”。它的意思是“不根据范围的长度而变化”。做一定量的工作以获得第一个元素是恒定时间。
这确实意味着等待所有数据然后适应范围类包装器的流在技术上不能满足
range
,但是这是 C++ 类型系统无法满足的语义要求(到目前为止)检测,并且这样的实现也可以被视为不适合作为流。