std::ranges::range
来自 cppreference.com
定义在头文件 <ranges> 中 |
||
template< class T > concept range = requires( T& t ) { |
(自 C++20) | |
range
概念定义了允许通过提供一个迭代器和一个哨兵来迭代其元素的类型的要求,这些迭代器和哨兵表示范围的元素。
内容 |
[编辑] 语义要求
给定一个表达式 E,使得 decltype((E)) 为 T
,T
仅当满足以下条件时才符合 range
:
-
[
ranges::begin(E),
ranges::end(E))
表示一个 范围,并且 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++ 标准。
DR | 应用于 | 已发布的行为 | 正确行为 |
---|---|---|---|
LWG 3915 | C++20 | ranges::begin(t) 和 ranges::end(t) 不需要隐式表达式变体 |
删除了 冗余描述 |