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) 不需要隐式表达式变体 |
移除了冗余要求 冗余描述 |