C++20带来了一个更强大的迭代器系统,其中之一是在迭代器类别的基础上引入了iterator_concept。
我发现C++20中许多迭代器的iterator_concept和iterator_category不一致。以最著名的iota_view为例。
尽管R模型random_access_range,但其迭代器的iterator_category只是一个input_iterator_tag,与iterator_concept不一致。
为什么C++20引入iterator_concept?它的目的是什么?如果我实现自己的迭代器,如何正确定义iterator_concept和iterator_category?在C++20中,iterator_category还有意义吗?
我发现C++20中许多迭代器的iterator_concept和iterator_category不一致。以最著名的iota_view为例。
using R = decltype(views::iota(0));
static_assert(random_access_range<R>);
using I = ranges::iterator_t<R>;
static_assert(same_as<typename I::iterator_category, input_iterator_tag>);
static_assert(same_as<typename I::iterator_concept, random_access_iterator_tag>);
尽管R模型random_access_range,但其迭代器的iterator_category只是一个input_iterator_tag,与iterator_concept不一致。
为什么C++20引入iterator_concept?它的目的是什么?如果我实现自己的迭代器,如何正确定义iterator_concept和iterator_category?在C++20中,iterator_category还有意义吗?
V
是随机访问,但V const
是前向访问。像...为什么?)更典型的情况是,V
是随机访问,但V const
不是一个范围,这种区别就不那么重要了。 - BarryV
没有提供begin() const
函数,则由于transform_view::begin() const
的约束条件,将不会实例化transform_view::iterator<const>
。我仍然无法理解const
在此处可能引起的问题。 - 康桓瑋