Namespaces
Variants

std::ranges:: ref_view

From cppreference.net
Ranges library
Range adaptors
定义于头文件 <ranges>
template < ranges:: range R >

requires std:: is_object_v < R >
class ref_view

: public ranges:: view_interface < ref_view < R >>
(C++20 起)

ref_view 是对其他某个 range 中元素的 view 。它封装了对该 range 的引用。

目录

数据成员

成员 描述
R* r_ 指向底层范围的指针
( 仅用于说明的成员对象* )

成员函数

构造引用给定范围的 ref_view
(公开成员函数)
返回被引用范围的引用
(公开成员函数)
返回被引用范围的起始迭代器
(公开成员函数)
返回被引用范围的哨兵
(公开成员函数)
检查被引用范围是否为空
(公开成员函数)
返回被引用 sized_range 的大小
(公开成员函数)
返回被引用 approximately_sized_range 的近似大小
(公开成员函数)
返回被引用 contiguous_range 起始位置的指针
(公开成员函数)
继承自 std::ranges::view_interface
(C++23)
返回范围的常量迭代器起始位置
( std::ranges::view_interface<D> 的公开成员函数)
(C++23)
返回范围常量迭代器的哨兵
( std::ranges::view_interface<D> 的公开成员函数)
返回派生视图是否非空,仅在可对其应用 ranges::empty 时提供
( std::ranges::view_interface<D> 的公开成员函数)
返回派生视图的首个元素,仅在满足 forward_range 时提供
( std::ranges::view_interface<D> 的公开成员函数)
返回派生视图的末尾元素,仅在满足 bidirectional_range common_range 时提供
( std::ranges::view_interface<D> 的公开成员函数)
返回派生视图中第 n 个元素,仅在满足 random_access_range 时提供
( std::ranges::view_interface<D> 的公开成员函数)

std::ranges::ref_view:: ref_view

template < /*different-from*/ < ref_view > T >

requires std:: convertible_to < T, R & > &&
requires { _FUN ( std:: declval < T > ( ) ) ; }

constexpr ref_view ( T && t ) ;
(since C++20)

使用 std:: addressof ( static_cast < R & > ( std:: forward < T > ( t ) ) ) 初始化 r_

当且仅当 std:: remove_cvref_t < T > std:: remove_cvref_t < U > 不是相同类型,且 _FUN 的重载声明为 void _FUN ( R & ) ; void _FUN ( R && ) = delete ; 时,满足 /*different-from*/ < T, U >

参数

t - 要引用的范围

std::ranges::ref_view:: base

constexpr R & base ( ) const ;
(since C++20)

返回 * r_

std::ranges::ref_view:: begin

constexpr ranges:: iterator_t < R > begin ( ) const ;
(since C++20)

返回 ranges:: begin ( * r_  )

std::ranges::ref_view:: end

constexpr ranges:: sentinel_t < R > end ( ) const ;
(since C++20)

返回 ranges:: end ( * r_  )

std::ranges::ref_view:: empty

constexpr bool empty ( ) const
requires requires { ranges:: empty ( * r_ ) ; } ;
(since C++20)

返回 ranges:: empty ( * r_  )

std::ranges::ref_view:: size

constexpr auto size ( ) const
requires ranges:: sized_range < R > ;
(since C++20)

返回 ranges:: size ( * r_  )

std::ranges::ref_view:: reserve_hint

constexpr auto size ( ) const
requires ranges :: approximately_sized_range < R > ;
(since C++26)

返回 ranges :: reserve_hint ( * r_  )

std::ranges::ref_view:: data

constexpr auto data ( ) const
requires ranges:: contiguous_range < R > ;
(since C++20)

返回 ranges:: data ( * r_  )

推导指引

template < class R >
ref_view ( R & ) - > ref_view < R > ;
(自 C++20 起)

辅助模板

template < class T >
constexpr bool enable_borrowed_range < ranges :: ref_view < T >> = true ;
(C++20 起)

std::ranges::enable_borrowed_range 的这一特化使 ref_view 满足 borrowed_range 的要求。

注释

功能测试 标准 功能
__cpp_lib_ranges_reserve_hint 202502L (C++26) ranges::approximately_sized_range reserve_hint

示例

#include <iostream>
#include <ranges>
int main()
{
    const std::string s{"cosmos"};
    const std::ranges::take_view tv{s, 3};
    const std::ranges::ref_view rv{tv};
    std::cout
        << std::boolalpha
        << "调用 empty(): " << rv.empty() << '\n'
        << "调用 size() : " << rv.size() << '\n'
        << "调用 begin(): " << *rv.begin() << '\n'
        << "调用 end()  : " << *(rv.end() - 1) << '\n'
        << "调用 data() : " << rv.data() << '\n'
        << "调用 base() : " << rv.base().size() << '\n' // ~> tv.size()
        << "范围循环   : ";
    for (const auto c : rv)
        std::cout << c;
    std::cout << '\n';
}

输出:

调用 empty(): false
调用 size() : 3
调用 begin(): c
调用 end()  : s
调用 data() : cosmos
调用 base() : 3
范围循环   : cos

缺陷报告

以下行为变更缺陷报告被追溯应用于先前发布的C++标准。

DR 适用范围 发布时的行为 正确行为
P2325R3 C++20 曾提供默认构造函数作为
view 必须满足 default_initializable 要求
随同该要求一并移除

参见

满足 CopyConstructible CopyAssignable 要求的引用包装器
(类模板)
对某个 range 具有独占所有权的 view
(类模板)
包含 range 所有元素的 view
(别名模板) (范围适配器对象)