Namespaces
Variants

std::ranges:: ref_view

From cppreference.net
Ranges library
Range adaptors
Определено в заголовочном файле <ranges>
template < ranges:: range R >

требует 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 , который ссылается на заданный диапазон
(public member function)
возвращает ссылку на ссылочный диапазон
(public member function)
возвращает начальный итератор ссылочного диапазона
(public member function)
возвращает страж ссылочного диапазона
(public member function)
проверяет, является ли ссылочный диапазон пустым
(public member function)
возвращает размер ссылочного sized_range
(public member function)
возвращает приблизительный размер ссылочного approximately_sized_range
(public member function)
возвращает указатель на начало ссылочного contiguous_range
(public member function)
Наследуется от std::ranges::view_interface
(C++23)
возвращает константный итератор на начало диапазона
(public member function of std::ranges::view_interface<D> )
(C++23)
возвращает страж для константного итератора диапазона
(public member function of std::ranges::view_interface<D> )
возвращает, является ли производное представление непустым, предоставляется только если ranges::empty применимо к нему
(public member function of std::ranges::view_interface<D> )
возвращает первый элемент в производном представлении, предоставляется если оно удовлетворяет forward_range
(public member function of std::ranges::view_interface<D> )
возвращает последний элемент в производном представлении, предоставляется только если оно удовлетворяет bidirectional_range и common_range
(public member function of std::ranges::view_interface<D> )
возвращает n элемент в производном представлении, предоставляется только если оно удовлетворяет random_access_range
(public member function of 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 ;
(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 ;
(начиная с 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 > ;
(since 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 > ;
(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
        << "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 Applied to Behavior as published Correct behavior
P2325R3 C++20 default constructor was provided as
view must be default_initializable
removed along with the requirement

Смотрите также

CopyConstructible и CopyAssignable обёртка ссылки
(шаблон класса)
view с уникальным владением некоторого range
(шаблон класса)
view который включает все элементы range
(псевдоним шаблона) (объект адаптера диапазона)