什么类型的 __iter_concept<_Iter>

What type of __iter_concept<_Iter>

我看过 std::random_access_iterator 和其他迭代器概念
这就是 GCC 实现的样子

template<typename _Iter>
    concept random_access_iterator = bidirectional_iterator<_Iter>
      && derived_from<__detail::__iter_concept<_Iter>,
              random_access_iterator_tag>
      && totally_ordered<_Iter> && sized_sentinel_for<_Iter, _Iter>
      && requires(_Iter __i, const _Iter __j,
          const iter_difference_t<_Iter> __n)
      {
    { __i += __n } -> same_as<_Iter&>;
    { __j +  __n } -> same_as<_Iter>;
    { __n +  __j } -> same_as<_Iter>;
    { __i -= __n } -> same_as<_Iter&>;
    { __j -  __n } -> same_as<_Iter>;
    {  __j[__n]  } -> same_as<iter_reference_t<_Iter>>;
      };

__iter_concept<_Iter> 是如何导出 from random_access_iterator_tag 的?

How is it that __iter_concept<_Iter>, derived from random_access_iterator_tag?

因为它是这样写的。 __iter_concept不是一个概念;它是 type(或类型别名)。 C++20 指定了一组规则,用于从实现 C++20 concept 化迭代器类别的有效迭代器中确定迭代器类别(前向、随机访问、输入等)。这些规则的名称容易混淆地命名为“ITER_CONCEPT”。

此处的“概念”一词表示它使用 C++20 概念规则进行此计算,而不是 C++17 预概念规则。

__detail::__iter_concept<T> 是 GCC 标准库中实现 ITER_CONCEPT 的模板元编程类型。由此得名。它生成一个继承自 ITER_CONCEPT 定义类型的类型,因此使用它的概念可以使用 derived_from 来检测迭代器类型。

___Capital 开头的符号保留供您的 C++ 编译器和标准库用于内部实现细节。 (标准禁止在其他任何地方使用此类符号,除非您的编译器明确允许)。

因此该模板是一些内部实现细节,用于实现该概念的 C++ 标准要求。

__detail::__iter_concept<_Iter>

这是 std 库内部实现获取给定类型标记的方法。它可能在 std headers 的其他地方定义为 C++ 代码。它是如何工作的,我会阅读源代码。或者更确切地说,我只是假设它按照它说的去做。

天真的方法就是使用 std iterator_traits.