Namespaces
Variants

std::ranges::ref_view

来自 zh.cppreference.net
 
 
范围库
范围适配器
 
定义于头文件 <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的引用。

数据成员

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

成员函数

构造引用给定范围的 ref_view
(公开成员函数)
返回被引用范围的引用
(公开成员函数)
返回被引用范围的起始迭代器
(公开成员函数)
返回被引用范围的哨兵
(公开成员函数)
检查被引用范围是否为空
(公开成员函数)
返回被引用 sized_range 的大小
(公开成员函数)
返回被引用 approximately_sized_range 的近似大小
(公开成员函数)
返回被引用 contiguous_range 起始位置的指针
(公开成员函数)
继承自 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
(别名模板) (范围适配器对象)