close
The Wayback Machine - https://web.archive.org/web/20240420221620/https://zh.cppreference.com/w/cpp/ranges/range

std::ranges::range

来自cppreference.com
< cpp‎ | ranges
 
 
范围库
范围访问
范围转换
(C++23)

范围原语



悬垂迭代器处理
范围概念
视图

范围工厂
范围适配器
范围生成器
范围适配器对象
范围适配器闭包对象
辅助项
(C++23 前)(C++23)


 
在标头 <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>,其中 Itbegin() 的返回类型。

它们也可以作为非成员函数实现,通过实参依赖查找找到。

[编辑] 示例

#include <iostream>
#include <ranges>
#include <vector>
 
template<typename T>
struct range_t : private T
{
    using T::begin, T::end; /* ... */
};
static_assert(std::ranges::range<range_t<std::vector<int>>>);
 
template<typename T>
struct scalar_t
{
    T t {}; /* 没有 begin/end */
};
static_assert(not std::ranges::range<scalar_t<int>>);
 
int main()
{
    if constexpr (range_t<std::vector<int>> r; std::ranges::range<decltype(r)>)
        std::cout << "r 是范围\n";
 
    if constexpr (scalar_t<int> s; not std::ranges::range<decltype(s)>)
        std::cout << "s 不是范围\n";
}

输出:

r 是范围
s 不是范围

[编辑] 缺陷报告

下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。

缺陷报告 应用于 出版时的行为 正确行为
LWG 3915 C++20 ranges::begin(t)ranges::end(t) 不要求有隐式的表达式变种 移除此多余描述