Namespaces
Variants

std::ranges::range

来自 zh.cppreference.net
 
 
范围库
范围适配器
 
定义于头文件 <ranges>
template< class T >
concept range = requires( T& t ) {
    ranges::begin(t); // equality-preserving for forward iterators
    ranges::end (t);
};
(C++20 起)

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

语义要求

给定表达式 E 使得 decltype ( ( E ) ) 为 T ,当且仅当 T 满足 range 概念时

注释

典型的 range 类仅需提供两个函数:

  1. 一个成员函数 begin() ,其返回类型需满足 input_or_output_iterator 概念。
  2. 一个成员函数 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 )
未要求隐式表达式变体
移除了
冗余描述