std::ranges::range
来自 cppreference.cn
定义于头文件 <ranges> |
||
template< class T > concept range = requires( T& t ) { |
(since 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) 不需要隐式表达式变体 |
移除了 冗余描述 |