代码之家  ›  专栏  ›  技术社区  ›  Nicol Bolas

用于迭代器的ts和c++20范围概念是否需要使用“operator->”的能力?

  •  15
  • Nicol Bolas  · 技术社区  · 6 年前

    我已经搜索了各种range ts建议,包括p0896,它将range合并到c++20中。从我的阅读来看,唯一的要求是 Iterator 在解引用方面的概念是 *t 是生成某种类型的对象的有效语法。

    自从 InputIterator 被定义为 迭代器 以及存在 Readable ,两者都不需要 operator-> 支持,看来范围ts和c++20不需要迭代器提供 -> 支持。

    是这样吗?

    1 回复  |  直到 6 年前
        1
  •  19
  •   Hong Ooi    6 年前

    是的,我们已经放弃了 operator-> 要求来自 InputIterator ,以及因此优化它的迭代器概念。(需求仍然是“旧的”输入迭代器需求的一部分,这些需求没有改变。)有很多原因:

    1. 没有办法实现 -> 对于许多迭代器类型,例如 i->m 相当于 (*i).m as the "old" requirements expect 是的。 move_iterator 是一个很好的例子: (*i.m) 是rvalue,而 I->米 是左值。(是的,这是另一个不满足迭代器要求的标准迭代器。)
    2. 没有办法有效地约束 -> 带着概念。当然,我们可以要求 一个 运算符-> ,但我们无法限制它使用合理的语法。
    3. 最重要的是, -> 对于标准算法来说是无用的:它们不知道迭代器表示的元素是否有成员,更不用说如何命名这些成员了。

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