我搜索了各种 Range TS 提案,包括 P0896,将范围合并到 C++20 中的提案。从我的阅读看来,该Iterator
概念在可解引用性方面提出的唯一要求是*t
产生某种类型的对象的有效语法。
由于是根据 be和 beInputIterator
定义的,两者都不需要支持,因此 Range TS 和 C++20 似乎不需要迭代器提供支持。Iterator
Readable
operator->
->
是这样吗?
是的,我们已经operator->
从 中删除了需求InputIterator
,因此也删除了改进它的迭代器概念。(该要求仍然是“旧”输入迭代器要求的一部分,没有改变。)有很多原因:
->
许多迭代器类型,使得 的语义i->m
等同于(*i).m
“旧”要求的期望。move_iterator
是一个很好的例子:(*i).m
是一个右值,而是i->m
一个左值。(是的,它是另一个不满足迭代器要求的标准迭代器。)->
概念。当然,我们可以要求有一个,operator->
但我们不能限制它具有合理的语法。->
是,它对标准算法毫无用处:它们不知道迭代器表示的元素是否有成员,更不用说如何命名这些成员了。这并不意味着标准迭代器不会提供operator->
(尽管参见LWG 2790),只是迭代器不需要实现这样的运算符即可与标准库一起使用。