迭代器的 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->
要求,因此删除了改进它的迭代器概念。 (该要求仍然是 "old" 输入迭代器要求的一部分,未更改。)原因有很多:
- 无法为许多迭代器类型实现
->
,因此 i->m
的语义等同于 (*i).m
as the "old" requirements expect。 move_iterator
是一个很好的例子:(*i).m
是一个右值,而 i->m
是一个左值。 (是的,它是另一个不满足迭代器要求的标准迭代器。)
- 无法用概念有效地约束
->
。当然,我们可以要求 是 和 operator->
,但我们不能将其限制为具有合理的语法。
- 最重要的是,
->
对标准算法毫无用处:它们不知道迭代器表示的元素是否有成员,更不用说如何命名这些成员了。
这并不意味着标准迭代器不会提供 operator->
(尽管参见 LWG 2790),只是迭代器不需要实现这样的运算符即可与标准一起使用图书馆。
我搜索了各种 Range TS 提案,包括 P0896,该提案将范围合并到 C++20 中。从我的阅读看来,Iterator
概念在取消引用能力方面的唯一要求是 *t
是产生某种类型对象的有效语法。
由于 InputIterator
是根据 Iterator
和 Readable
定义的,两者都不需要 operator->
支持,看来 Range TS 和 C ++20 不要求迭代器提供 ->
支持。
是这样吗?
是的,我们从 InputIterator
中删除了 operator->
要求,因此删除了改进它的迭代器概念。 (该要求仍然是 "old" 输入迭代器要求的一部分,未更改。)原因有很多:
- 无法为许多迭代器类型实现
->
,因此i->m
的语义等同于(*i).m
as the "old" requirements expect。move_iterator
是一个很好的例子:(*i).m
是一个右值,而i->m
是一个左值。 (是的,它是另一个不满足迭代器要求的标准迭代器。) - 无法用概念有效地约束
->
。当然,我们可以要求 是 和operator->
,但我们不能将其限制为具有合理的语法。 - 最重要的是,
->
对标准算法毫无用处:它们不知道迭代器表示的元素是否有成员,更不用说如何命名这些成员了。
这并不意味着标准迭代器不会提供 operator->
(尽管参见 LWG 2790),只是迭代器不需要实现这样的运算符即可与标准一起使用图书馆。