对于迭代器,Range TS和C 20概念是否需要能够使用`operator->`?
作者:互联网
我搜索了各种Range TS提议,包括P0896,将范围纳入C 20.从我的阅读中可以看出,Iterator概念在解除引用性方面的唯一要求是* t是产生对象的有效语法某种类型.
由于InputIterator是作为迭代器定义并且是可读的,因此这两者都不需要operator->支持,似乎范围TS和C 20不要求迭代器提供 – >支持.
是这样的吗?
解决方法:
是的,我们放弃了操作符 – >来自InputIterator的需求,以及因此优化它的迭代器概念. (该要求仍然是“旧”输入迭代器要求的一部分,它们没有变化.)有很多原因:
>没有办法实施 – >对于许多迭代器类型,使得i-> m的语义等价于(* i).m as the “old” requirements expect. move_iterator是一个很好的例子:(* i).m是一个rvalue,而i-> m是一个左值. (是的,它是另一个不满足迭代器要求的标准迭代器.)
>没有办法有效约束 – >与概念.当然,我们可以要求有一个运算符 – >;但我们不能限制它有合理的语法.
>最重要的是, – >对标准算法没用:他们不知道迭代器表示的元素是否有成员,更不用说如何命名这些成员了.
这并不意味着标准迭代器不会提供运算符 – > (尽管参见LWG 2790),只有迭代器不需要实现这样的运算符才能与标准库一起使用.