关于单遍范围的方法begin()的要求

问题描述 投票:0回答:1

根据cppreference(std::ranges::range):

语义要求

给定一个表达式 E,使得 decltype((E)) 为

T
T
模型
range
仅当

但是要求对于单遍范围,函数

ranges::begin(E)
是摊销常数时间是否合理?事实上,对于这样的范围,方法
E.begin()
实际上将包含对
E.get_next_value()
之类的调用。因此,如果
E
不是预定义元素的集合(例如,如果
E
是流或
E
就像流),则无法满足上述要求。

c++
1个回答
0
投票

但是要求对于单遍范围,函数 range::begin(E) 是摊销常数时间是否合理?

是的。摊余常数时间并不意味着“速度极快”。它的意思是“不根据范围的长度而变化”。做一定量的工作以获得第一个元素恒定时间。

这确实意味着等待所有数据然后适应范围类包装器的流在技术上不能满足

range
,但是这是 C++ 类型系统无法满足的语义要求(到目前为止)检测,并且这样的实现也可以被视为不适合作为流。

© www.soinside.com 2019 - 2024. All rights reserved.