std::ranges::range
来自 cppreference.cn
| 定义于头文件 <ranges> |
||
| template< class T > concept range = requires( T& t ) { |
(C++20 起) | |
range 概念定义了一个类型,它通过提供一个迭代器和哨兵来表示范围内的元素,从而允许迭代其元素。
目录 |
[编辑] 语义要求
给定一个表达式 E,使得 decltype((E)) 是 T,T 只有在以下情况下才符合 range 模型:
-
[ranges::begin(E),ranges::end(E))表示一个 range,并且 - ranges::begin(E) 和 ranges::end(E) 都是摊销常数时间,并且不以可观察的方式改变 E 的值,以保持相等性表达式,并且
- 如果 ranges::begin(E) 的类型符合
forward_iterator模型,则 ranges::begin(E) 保持 相等性(换句话说,前向迭代器支持多趟算法)。
[编辑] 注意
一个典型的 range 类只需要提供两个函数
- 一个成员函数
begin(),其返回类型符合input_or_output_iterator模型。 - 一个成员函数
end(),其返回类型符合sentinel_for<It>模型,其中It是begin()的返回类型。
另外,它们也可以是非成员函数,通过参数依赖查找找到。
[编辑] 示例
运行此代码
#include <ranges> // A minimum range struct SimpleRange { int* begin(); int* end(); }; static_assert(std::ranges::range<SimpleRange>); // Not a range: no begin/end struct NotRange { int t {}; }; static_assert(!std::ranges::range<NotRange>); // Not a range: begin does not return an input_or_output_iterator struct NotRange2 { void* begin(); int* end(); }; static_assert(!std::ranges::range<NotRange2>); int main() {}
[编辑] 缺陷报告
下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。
| 缺陷报告 | 应用于 | 发布时的行为 | 正确的行为 |
|---|---|---|---|
| LWG 3915 | C++20 | ranges::begin(t) 和 ranges::end(t) 不需要隐式表达式变体 |
移除了冗余要求 冗余描述 |