首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么ITER_CONCEPT要混淆迭代器的特性::迭代器_概念/类别?

为什么ITER_CONCEPT要混淆迭代器的特性::迭代器_概念/类别?
EN

Stack Overflow用户
提问于 2022-01-20 07:35:54
回答 1查看 120关注 0票数 0

根据[iterator.concepts.general]

否则,如果iterator_traits指定从主模板生成的专门化,则ITER_CONCEPT(I)表示random_access_iterator_tag。

ITER_CONCEPT(I)可能是std::random_access_iterator_tag,即使我模拟了input_iterator。

这样做的目的是什么?为什么c++ 20迭代器概念(如std::forward_iterator)仍然检查ITER_CONCEPT是否来自某个标记?示例:

代码语言:javascript
复制
template<class I>
concept forward_iterator =
input_iterator<I> &&
derived_from<ITER_CONCEPT(I), forward_iterator_tag> && //is this necessary?
incrementable<I> &&
sentinel_for<I, I>;
EN

回答 1

Stack Overflow用户

发布于 2022-01-20 15:02:02

要成为X迭代器,迭代器的概念需要(除其他外)两件事情。类型可能无意地满足迭代器的语法要求。因此,要成为X迭代器,预期的迭代器类型必须声明它打算(至少)是X迭代器。这是通过tag类型完成的,就像通过ITER_CONCEPT检索的那样。

但是迭代器有一种“继承”图。所有随机存取迭代器也是双向的。因此,每个迭代器概念都要求预期迭代器类型满足其“基本”迭代器概念的概念要求。

这些都是单独的要求。类型毕竟可以说谎,而概念的全部意义是防止类型说谎。仅仅因为一个类型声称是一个前向迭代器并不意味着它实际上是一个迭代器。

至于ITER_CONCEPT中这个特定规则的目的,它是为iterator_category定义的绕过违约机制。这样做的想法是,如果没有显式指定迭代器的标记类型,那么ITER_CONCEPT将假设(第二)最允许的类型,然后使用C++20的概念检查来查看迭代器实际支持的内容。

这并不意味着这个迭代器绝对是一个随机访问迭代器;它的意思是“尝试(几乎)任何东西,如果这个概念不适合,那就不是它”。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70782282

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档