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

标签 c++ c++20

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

由于 InputIterator 被定义为 IteratorReadable,两者都不需要 operator-> 支持,Range TS 和 C++20 似乎不需要迭代器提供 -> 支持。

是这样吗?

最佳答案

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

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

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

关于c++ - 迭代器的 Range TS 和 C++20 概念是否需要能够使用 `operator->` ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51093479/

相关文章:

c++ - 将 '>>' 与自己的类(class)交友

c++ - RVO 和 NRVO 优化 + C++11 move 运算符

c++ - 如何编写与 std::ranges 兼容的无限序列?

c++ - sfinae 与非类型模板参数的概念

split - 如何使用 C++20 std::views::split 将 std::string_views 拆分为类似元组的对象?

c++ - int 到 unsigned int 的无效转换

C++。每帧更新和复制一系列值。我应该使用哪种类类型?

c++ - 使用大括号括起来的初始化列表初始化结构 vector

c++ - std::chrono::from_stream 正确用法

c++ - 是否存在考虑所有元素的 ranges::views::group_by 对应物,而不是仅仅考虑连续的元素?