命名空间
变体
操作

std::ranges::range

来自 cppreference.com
< cpp‎ | ranges
 
 
范围库
范围适配器
 
定义在头文件 <ranges>
template< class T >

concept range = requires( T& t ) {
    ranges::begin(t); // 对于前向迭代器,保持相等
    ranges::end (t);

};
(自 C++20)

range 概念定义了允许通过提供一个迭代器和一个哨兵来迭代其元素的类型的要求,这些迭代器和哨兵表示范围的元素。

内容

[编辑] 语义要求

给定一个表达式 E,使得 decltype((E))TT 仅当满足以下条件时才符合 range

[编辑] 注释

一个典型的 range 类只需要提供两个函数

  1. 一个成员函数 begin(),其返回类型符合 input_or_output_iterator
  2. 一个成员函数 end(),其返回类型符合 sentinel_for<It>,其中 Itbegin() 的返回值类型。

或者,它们可以是非成员函数,通过 依赖于参数的查找找到。

[编辑] 示例

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