【问题标题】:Do the Range TS and C++20 concepts for iterators require the ability to use `operator->`?迭代器的 Range TS 和 C++20 概念是否需要使用 `operator->` 的能力?
【发布时间】:2018-12-08 03:52:31
【问题描述】:

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

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

是这样吗?

【问题讨论】:

  • 嗯。它仍然列在P1037 的输入迭代器要求中(搜索a->m)。但是有一句话在别处删除了该要求(搜索i->m)。
  • 当然Iterator<int*>InputIterator<int*> 应该是正确的。并不是说当值类型仅为类类型时该提案不能要求operator->,但我不确定这是否会引入其他复杂性。
  • @Barry 在 P1037R0 中,在我看来箭头要求适用于英文术语“输入迭代器”,但不适用于 C++ 概念std::ranges::Iterator

标签: c++ c++20


【解决方案1】:

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

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

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

【讨论】:

  • 最后一段描述了一个好的设计实践:提供尽可能多的功能,但需要尽可能少的需求。各种设计的慷慨:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-06
  • 2021-03-04
  • 2016-08-01
  • 2023-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多