![](/img/trans.png)
[英]C++20 concepts require operator overloading combine with user-define template operator overloading function
[英]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->
InputIterator
,从而删除了优化它的迭代器概念。 (该要求仍然是“旧”输入迭代器要求的一部分,它们没有变化。)有很多原因:
->
对于许多迭代器类型,使得i->m
的语义等同于(*i).m
作为“旧”要求所期望的 。 move_iterator
是一个很好的例子: (*i).m
是一个右值,而i->m
是一个左值。 (是的,它是另一个不满足迭代器要求的标准迭代器。) ->
概念。 当然,我们可以要求有一个operator->
,但我们不能限制它有合理的语法。 ->
对标准算法没用:他们不知道迭代器表示的元素是否有成员,更不用说如何命名这些成员了。 这并不意味着标准迭代器不会提供operator->
(尽管参见LWG 2790 ),只是不需要迭代器来实现这样的运算符以便与标准库一起使用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.