# std::ranges::ref_view

< cpp‎ | ranges

定义于头文件 `<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` 的引用。

### 数据成员

`ref_view` 表现如同它仅存储一个指向被引用范围的 R* 成员子对象。此处显示该成员为 `r_` （名称仅用于阐释）。

### 成员函数

(构造函数) (C++20) | 构造引用给定范围的 `ref_view` (公开成员函数)
base (C++20) | 返回到被引用范围的引用 (公开成员函数)
begin (C++20) | 返回被引用范围的起始迭代器 (公开成员函数)
end (C++20) | 返回被引用范围的哨位 (公开成员函数)
empty (C++20) | 检查被引用范围是否为空 (公开成员函数)
size (C++20) | 返回被引用 `sized_range` 的大小 (公开成员函数)
data (C++20) | 返回指向被引用 `contiguous_range` 起始的指针 (公开成员函数)
##### 继承自 std::ranges::view_interface
operator bool (C++20) | 返回派生视图是否为非空。若 ranges::empty 可应用于它则提供。 (`std::ranges::view_interface<D>` 的公开成员函数)
front (C++20) | 返回派生视图中的首元素。若视图满足 `forward_range` 则提供。 (`std::ranges::view_interface<D>` 的公开成员函数)
back (C++20) | 返回派生视图中的末元素。若视图满足 `bidirectional_range` 与 `common_range` 则提供。 (`std::ranges::view_interface<D>` 的公开成员函数)
operator[] (C++20) | 返回派生视图中的第 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); |  | (C++20 起)

以 std::addressof(static_cast<R&>(std::forward<T>(t))) 初始化 `r_` 。

/*different-from*/<T, U> 当且仅当 std::remove_cvref_t<T> 与 std::remove_cvref_t<U>> 不是同一类型才得到满足，而 `_FUN` 的重载声明为 void _FUN(R&); void _FUN(R&&) = delete; 。

### 参数

t | - | 要引用的范围

## std::ranges::rev_view::base

constexpr R& base() const; |  | (C++20 起)

等价于 return *r_;

## std::ranges::ref_view::begin

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

等价于 return ranges::begin(*r_);

## std::ranges::ref_view::end

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

等价于 return ranges::end(*r_);

## std::ranges::ref_view::empty

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

等价于 return ranges::empty(*r_);

## std::ranges::ref_view::size

constexpr auto size() const requires ranges::sized_range<R> { return ranges::size(*r_); } |  | (C++20 起)

## std::ranges::ref_view::data

constexpr auto data() const requires ranges::contiguous_range<R> { return ranges::data(*r_); } |  | (C++20 起)

### 推导指引

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

### 辅助模板

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

`std::ranges::enable_borrowed_range` 的此特化使得 `ref_view` 满足 `borrowed_range` 。

### 示例

    #include <ranges>
    #include <iostream>

    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
            << "call empty() : " << rv.empty() << '\n'
            << "call size()  : " << rv.size() << '\n'
            << "call begin() : " << *rv.begin() << '\n'
            << "call end()   : " << *(rv.end()-1) << '\n'
            << "call data()  : " << rv.data() << '\n'
            << "call base()  : " << rv.base().size() << '\n' // ~> tv.size()
            << "range-for    : ";

        for (const auto c: rv) { std::cout << c; }
        std::cout << '\n';
    }

输出：

    call empty() : false
    call size()  : 3
    call begin() : c
    call end()   : s
    call data()  : cosmos
    call base()  : 3
    range-for    : cos

### 缺陷报告

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

DR | 应用于 | 出版时的行为 | 正确行为
--- | --- | --- | ---
P2325R3 | C++20 | 由于 `view` 必须为 `default_initializable` 提供了默认构造函数 | 与该要求一同移除

### 参阅

reference_wrapper (C++11) | 可复制构造 (CopyConstructible) 且可复制赋值 (CopyAssignable) 的引用包装器 (类模板)
ranges::owning_view (C++20) | 拥有某 `range` 的独占所有权的 `view` (类模板)
views::all_t views::all (C++20) | 包含 `range` 的所有元素的 `view` (别名模板) (范围适配器对象)