c++ - 迭代器的 Range TS 和 C++20 概念是否需要使用 `operator->` 的能力?
问题描述
我搜索了各种 Range TS 提案,包括 P0896,将范围合并到 C++20 中的提案。从我的阅读看来,该Iterator
概念在可解引用性方面提出的唯一要求是*t
产生某种类型的对象的有效语法。
由于是根据 be和 beInputIterator
定义的,两者都不需要支持,因此 Range TS 和 C++20 似乎不需要迭代器提供支持。Iterator
Readable
operator->
->
是这样吗?
解决方案
是的,我们已经operator->
从 中删除了需求InputIterator
,因此也删除了改进它的迭代器概念。(该要求仍然是“旧”输入迭代器要求的一部分,没有改变。)有很多原因:
- 没有办法实现
->
许多迭代器类型,使得 的语义i->m
等同于(*i).m
“旧”要求的期望。move_iterator
是一个很好的例子:(*i).m
是一个右值,而是i->m
一个左值。(是的,它是另一个不满足迭代器要求的标准迭代器。) - 没有办法有效地限制
->
概念。当然,我们可以要求有一个,operator->
但我们不能限制它具有合理的语法。 - 最重要的
->
是,它对标准算法毫无用处:它们不知道迭代器表示的元素是否有成员,更不用说如何命名这些成员了。
这并不意味着标准迭代器不会提供operator->
(尽管参见LWG 2790),只是迭代器不需要实现这样的运算符即可与标准库一起使用。
推荐阅读
- python - 使用 spotipy 在烧瓶会话中存储 Spotify 令牌?
- sql-server - 如何在使用 OPENJSON WITH 时执行字符串函数?
- symlink - WSL:使用 Windows 中的 WSL 符号链接文件夹
- python-3.x - 如何让我的程序知道并响应按下的键
- r - RMarkdown - knitr - png 大小不会改变
- swift - 重载 == 运算符为 != 调用父函数
- php - 如何在 PHPMailer 成功消息中包含 html div 或 php?
- c# - 奇怪的反序列化异常
- laravel - FontAwesome 图标没有正确堆叠
- python - 抓取必应翻译的问题