std::ranges:: range
|
||||||||||||||||||||||
| Range primitives | |||||||
|
|||||||
| Range concepts | ||||||||||||||||||||||||||||||||||
|
|
|||||||||||||||||||||||||||||||||
| Range factories | |||||||||
|
|||||||||
| Range adaptors | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||
| Helper items | |||||||||||||||||
|
|
||||||||||||||||
|
定义于头文件
<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> // 最小范围示例 struct SimpleRange { int* begin(); int* end(); }; static_assert(std::ranges::range<SimpleRange>); // 非范围:缺少 begin/end 方法 struct NotRange { int t {}; }; static_assert(!std::ranges::range<NotRange>); // 非范围:begin 未返回 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
)
未要求隐式表达式变体 |
移除了
冗余描述 |