否则,如果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是否来自某个标记?示例:
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>;发布于 2022-01-20 15:02:02
要成为X迭代器,迭代器的概念需要(除其他外)两件事情。类型可能无意地满足迭代器的语法要求。因此,要成为X迭代器,预期的迭代器类型必须声明它打算(至少)是X迭代器。这是通过tag类型完成的,就像通过ITER_CONCEPT检索的那样。
但是迭代器有一种“继承”图。所有随机存取迭代器也是双向的。因此,每个迭代器概念都要求预期迭代器类型满足其“基本”迭代器概念的概念要求。
这些都是单独的要求。类型毕竟可以说谎,而概念的全部意义是防止类型说谎。仅仅因为一个类型声称是一个前向迭代器并不意味着它实际上是一个迭代器。
至于ITER_CONCEPT中这个特定规则的目的,它是为iterator_category定义的绕过违约机制。这样做的想法是,如果没有显式指定迭代器的标记类型,那么ITER_CONCEPT将假设(第二)最允许的类型,然后使用C++20的概念检查来查看迭代器实际支持的内容。
这并不意味着这个迭代器绝对是一个随机访问迭代器;它的意思是“尝试(几乎)任何东西,如果这个概念不适合,那就不是它”。
https://stackoverflow.com/questions/70782282
复制相似问题