我观察了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
的?
__iter_concept<_Iter>
是如何从random_access_iterator_tag
派生的?
因为它被写为.__iter_concept
不是一个概念;它是类型(或类型别名(。C++20指定了一组规则,用于从实现C++20concept
化迭代器类别的有效迭代器中确定迭代器类型(前向、随机访问、输入等(。这些规则的名称被混淆地命名为";ITER_CONCEPT";。
单词";概念";这里表示它使用C++20概念规则进行此计算,而不是C++17概念前规则。
__detail::__iter_concept<T>
是实现ITER_CONCEPT的GCC标准库中的模板元编程类型。因此得名。它生成一个继承自ITER_CONCEPT定义类型的类型,以便使用它的概念可以使用derived_from
来检测迭代器类型。
以__
或_Capital
开头的符号保留给c++编译器和std库,用于内部实现详细信息。(除非编译器明确允许,否则标准禁止在其他任何地方使用此类符号(。
因此,该模板是一些内部实现细节,用于实现该概念的C++标准要求。
__detail::__iter_concept<_Iter>
这是std库内部实现获取给定类型的标记的方法。它可能在std头中的其他地方被定义为C++代码。它是如何工作的,我会阅读源代码。或者更确切地说,我只是假设它言出必行。
最简单的方法就是使用标准iterator_traits
。