std::ranges::Range

来自cppreference.com
< cpp‎ | ranges
定义于头文件 <ranges>
template< class T >
concept Range = _RangeImpl<T&>; // 仅为说明的定义
(1)
// 仅为说明的辅助概念

template< class T >
concept __RangeImpl = requires(T&& t) {
  ranges::begin(std::forward<T>(t)); // 对向前迭代器保持相等性
  ranges::end  (std::forward<T>(t));

};
(2)
// 仅为说明的辅助概念

template< class T >

concept __ForwardingRange = Range<T> && __RangeImpl<T>;
(3)
1) Range 概念定义允许通过指代元素范围的迭代器和哨位,在其元素上迭代的类型。

正式而言,给定满足 decltype((E))T 的表达式 ET 实现 Range 仅若:

  • [ranges::begin(E), ranges::end(E)) 代表范围,且
  • ranges::begin(E)ranges::end(E) 均有均摊常量时间复杂度且不修改,且
  • ranges::begin(E) 实现 forward_iterator ,则 ranges::begin(E) 保持相等性(换言之,向前迭代器支持多趟算法)
注意:在上述仅为说明的定义中,要求的表达式 ranges::begin(std::forward<T>(t))ranges::end(std::forward<T>(t)) 不要求隐式表达式变种
3) 仅为说明的概念 __ForwardingRange 定义范围的要求,它要使得函数能按值接收它,并返回从它获得的迭代器,而无悬垂之虞。

正式而言,给定满足 decltype((E))T 的表达式 E 和与 E 代表同一对象的左值 tT 实现 __ForwardingRange 仅若

  • ranges::begin(E)ranges::begin(t) 表达式等价(求值时拥有相同效果,均为或均不为潜在抛出,均为或均不为常量表达式),且
  • ranges::end(E)ranges::end(t) 表达式等价,且
  • E 所代表的对象获得的迭代器的合法性不捆绑到该对象的生存期。