std::ranges::range
来自cppreference.com
定义于头文件 <ranges>
|
||
template< class T > concept range = __RangeImpl<T&>; // 仅用于阐释的定义 |
(1) | |
// 仅用于阐释的辅助概念 template< class T > |
(2) | |
// 仅用于阐释的辅助概念 template< class T > |
(3) | |
1)
range
概念定义允许通过指代元素范围的迭代器和哨位,在其元素上迭代的类型。3) 仅为说明的概念 __ForwardingRange 定义范围的要求,它要使得函数能按值接收它,并返回从它获得的迭代器,而无悬垂之虞。
语义要求
1) 给定满足 decltype((E)) 为 T 的表达式 E , T 实现 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) 给定满足 decltype((E)) 为 T 的表达式 E 和与 E 代表同一对象的左值 t , T 实现 __ForwardingRange 仅若
- ranges::begin(E) 与 ranges::begin(t) 表达式等价,且
- ranges::end(E) 与 ranges::end(t) 表达式等价,且
- 从 E 所代表的对象获得的迭代器的合法性不捆绑到该对象的生存期。
表达式等价
表达式 e 表达式等价于表达式 f ,若 e 与 f 拥有相同效果,均为潜在抛出或均非潜在抛出(即 noexcept(e) == noexcept(f) ),且均为常量子表达式或均非常量子表达式。