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

问题描述

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

由于是根据 be和 beInputIterator定义的,两者都不需要支持,因此 Range TS 和 C++20 似乎不需要迭代器提供支持。IteratorReadableoperator->->

是这样吗?

标签: c++c++20

解决方案


是的,我们已经operator->从 中删除了需求InputIterator,因此也删除了改进它的迭代器概念。(该要求仍然是“旧”输入迭代器要求的一部分,没有改变。)有很多原因:

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

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


推荐阅读