迭代器的 Range TS 和 C++20 概念是否需要使用 `operator->` 的能力?

Do the Range TS and C++20 concepts for iterators require the ability to use `operator->`?

我搜索了各种 Range TS 提案,包括 P0896,该提案将范围合并到 C++20 中。从我的阅读看来,Iterator 概念在取消引用能力方面的唯一要求是 *t 是产生某种类型对象的有效语法。

由于 InputIterator 是根据 IteratorReadable 定义的,两者都不需要 operator-> 支持,看来 Range TS 和 C ++20 不要求迭代器提供 -> 支持。

是这样吗?

是的,我们从 InputIterator 中删除了 operator-> 要求,因此删除了改进它的迭代器概念。 (该要求仍然是 "old" 输入迭代器要求的一部分,未更改。)原因有很多:

  1. 无法为许多迭代器类型实现 ->,因此 i->m 的语义等同于 (*i).m as the "old" requirements expectmove_iterator 是一个很好的例子:(*i).m 是一个右值,而 i->m 是一个左值。 (是的,它是另一个不满足迭代器要求的标准迭代器。)
  2. 无法用概念有效地约束 ->。当然,我们可以要求 operator->,但我们不能将其限制为具有合理的语法。
  3. 最重要的是,-> 对标准算法毫无用处:它们不知道迭代器表示的元素是否有成员,更不用说如何命名这些成员了。

这并不意味着标准迭代器不会提供 operator->(尽管参见 LWG 2790),只是迭代器不需要实现这样的运算符即可与标准一起使用图书馆。