Namespaces
Variants

std::ranges:: range

From cppreference.net
Ranges library
Range adaptors
定义于头文件 <ranges>
template < class T >

concept range = requires ( T & t ) {
ranges:: begin ( t ) ; // 对于前向迭代器保持相等性
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 )
未要求隐式表达式变体
移除了
冗余描述