我看了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的?
发布于 2021-06-19 13:30:03
__iter_concept<_Iter>是如何从random_access_iterator_tag中衍生出来的?
因为这是写出来的。__iter_concept不是一个概念;它是一个类型(或类型别名)。C++20指定一组规则,用于从实现C++20 concept-ified迭代器类别的有效迭代器中确定迭代器类别(前向、随机访问、输入等)。这些规则的名称令人困惑地命名为"概念“。
这里的“概念”一词指的是在计算中使用C++20概念规则,而不是C++17预概念规则。
__detail::__iter_concept<T>是GCC标准库中实现ITER_CONCEPT的模板元编程类型。于是就得名了。它生成从ITER_概念定义类型继承的类型,以便使用它的概念可以使用derived_from来检测迭代器类型。
发布于 2021-06-19 13:46:26
从__或_Capital开始的符号保留给您的c++编译器和std库,以便用于内部实现详细信息。(除非编译器明确允许,否则标准禁止在其他任何地方使用此类符号)。
因此,模板是用于实现该概念的C++标准要求的一些内部实现细节。
__detail::__iter_concept<_Iter>这是std库内部实现获取给定类型的标记的方法。它可能在std标头的其他地方被定义为C++代码。它的工作原理,我会阅读源代码。或者更确切地说,我只是假设它会照它说的去做。
天真的方法就是使用std iterator_traits。
https://stackoverflow.com/questions/68046909
复制相似问题