Spec-Zone.ru › C++

std::ranges::ref_view

Определён в заголовочном файле <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 — это view элементов другого range. Он содержит ссылку на этот range.

Поля данных

Поле Описание
R* r_ указатель на базовый диапазон
(поле объекта, используемое только для экспозиции*)

Функции-члены

(конструктор)
создаёт ref_view, ссылающийся на заданный диапазон
(открытая функция-член)
base
возвращает ссылку на диапазон, на который ссылается объект
(открытая функция-член)
begin
возвращает итератор начала диапазона, на который ссылается объект
(открытая функция-член)
end
возвращает sentinel диапазона, на который ссылается объект
(открытая функция-член)
empty
проверяет, пуст ли диапазон, на который ссылается объект
(открытая функция-член)
size
возвращает размер диапазона sized_range, на который ссылается объект
(открытая функция-член)
reserve_hint
(C++26)
возвращает приблизительный размер диапазона approximately_sized_range, на который ссылается объект
(открытая функция-член)
data
возвращает указатель на начало непрерывного диапазона contiguous_range, на который ссылается объект
(открытая функция-член)
Унаследовано от std::ranges::view_interface
cbegin
(C++23)
возвращает константный итератор на начало диапазона
(открытая функция-член std::ranges::view_interface<D>)
cend
(C++23)
возвращает sentinel для константного итератора диапазона
(открытая функция-член std::ranges::view_interface<D>)
operator bool
возвращает, является ли производное представление непустым; доступен только если к нему применимо ranges::empty
(открытая функция-член std::ranges::view_interface<D>)
front
возвращает первый элемент производного представления, если оно удовлетворяет требованиям forward_range
(открытая функция-член std::ranges::view_interface<D>)
back
возвращает последний элемент производного представления, если оно удовлетворяет требованиям bidirectional_range и common_range
(открытая функция-член std::ranges::view_interface<D>)
operator[]
возвращает элемент с индексом 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)

Инициализирует r_ значением std::addressof(static_cast<R&>(std::forward<T>(t))).

Условие /*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::ref_view::base

constexpr R& base() const;
(начиная с C++20)

Возвращает *r_.

std::ranges::ref_view::begin

constexpr ranges::iterator_t<R> begin() const;
(начиная с C++20)

Возвращает ranges::begin(*r_ ).

std::ranges::ref_view::end

constexpr ranges::sentinel_t<R> end() const;
(начиная с C++20)

Возвращает ranges::end(*r_ ).

std::ranges::ref_view::empty

constexpr bool empty() const
    requires requires { ranges::empty(*r_); };
(начиная с C++20)

Возвращает ranges::empty(*r_ ).

std::ranges::ref_view::size

constexpr auto size() const
    requires ranges::sized_range<R>;
(начиная с C++20)

Возвращает ranges::size(*r_ ).

std::ranges::ref_view::reserve_hint

constexpr auto size() const
    requires ranges::approximately_sized_range<R>;
(начиная с C++26)

Возвращает ranges::reserve_hint(*r_ ).

std::ranges::ref_view::data

constexpr auto data() const
    requires ranges::contiguous_range<R>;
(начиная с 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
        << "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++.

Отчёт об ошибке Применён к Поведение согласно опубликованной версии Корректное поведение
P2325R3 C++20 конструктор по умолчанию предоставлялся, поскольку
view должен удовлетворять требованиям default_initializable
удалён вместе с этим требованием

См. также

reference_wrapper
(C++11)
обёртка ссылки с семантикой CopyConstructible и CopyAssignable
(шаблон класса)
ranges::owning_view
(C++20)
view с единоличным владением некоторым range
(шаблон класса)
views::all_tviews::all
(C++20)
view, включающее все элементы range
(шаблон псевдонима) (объект адаптера диапазона)

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/ranges/ref_view

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API