我搜索了各种 Range TS 提案,包括 P0896,将范围合并到 C++20 中的提案。从我的阅读看来,Iterator
概念在可取消引用方面的唯一要求是 *t
是产生某种类型对象的有效语法。
由于 InputIterator
被定义为 Iterator
和 Readable
,两者都不需要 operator->
支持,Range TS 和 C++20 似乎不需要迭代器提供 ->
支持。
是这样吗?
最佳答案
是的,我们已经从 InputIterator
中删除了 operator->
要求,因此改进了它的迭代器概念。 (该要求仍然是“旧”输入迭代器要求的一部分,没有改变。)原因有很多:
- 没有办法为许多迭代器类型实现
->
,使得i->m
的语义等同于(*i).m
as the "old" requirements expect .move_iterator
就是一个很好的例子:(*i).m
是一个右值,而i->m
是一个左值。 (是的,它是另一个不满足迭代器要求的标准迭代器。) - 没有办法用概念有效地约束
->
。当然,我们可以要求 is 有一个operator->
,但我们不能限制它具有合理的语法。 - 最重要的是,
->
对标准算法毫无用处:它们不知道迭代器表示的元素是否有成员,更不用说如何命名这些成员了。
这并不意味着标准迭代器不会提供 operator->
(尽管参见 LWG 2790 ),只是迭代器不需要实现这样的操作符即可与标准库。
关于c++ - 迭代器的 Range TS 和 C++20 概念是否需要能够使用 `operator->` ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51093479/