命名空间
变体
操作

std::ranges::range

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

concept range = requires( T& t ) {
    ranges::begin(t); // equality-preserving for forward iterators
    ranges::end (t);

};
(since C++20)

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

目录

[编辑] 语义要求

给定一个表达式 E,使得 decltype((E))T,仅当满足以下条件时,T 才建模 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)
不需要隐式表达式变体
移除了
冗余描述