对于迭代器,Range TS和C++ 20概念是否需要能够使用`operator->`?

Nic*_*las 15 c++ c++20

我搜索了各种Range TS提议,包括P0896,将范围纳入C++ 20.从我的阅读中可以看出,该Iterator概念在解除引用性方面的唯一要求是*t产生某种类型对象的有效语法.

既然InputIterator是以a Iterator和is来定义Readable,两者都不需要operator->支持,那么Range TS和C++ 20似乎不要求迭代器提供->支持.

是这样的吗?

Cas*_*sey 19

是的,我们已经删除了operator->需求InputIterator,并因此删除了优化它的迭代器概念.(该要求仍然是"旧"输入迭代器要求的一部分,它们没有变化.)有很多原因:

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

这并不意味着标准迭代器不会提供operator->(虽然参见LWG 2790),但只有迭代器不需要实现这样的运算符才能与标准库一起使用.

  • 最后一段描述了一个好的设计实践:提供尽可能多的功能,但需要尽可能少的功能.慷慨的设计,各种:) (5认同)