繁体   English   中英

对于迭代器,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是作为Iterator定义并且是Readable ,它们都不需要operator->支持,因此Range TS和C ++ 20似乎不要求迭代器提供->支持。

是这样的吗?

是的,我们从InputIterator删除了operator-> InputIterator ,从而删除了优化它的迭代器概念。 (该要求仍然是“旧”输入迭代器要求的一部分,它们没有变化。)有很多原因:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM