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_ (private) | Указатель типа R* на базовое диапазон.(объект-только для демонстрации*) |
Члены-функции
|
(C++20) | создаёт ref_view, ссылающуюся на заданный диапазон(публичная функция-член) |
|
(C++20) | возвращает ссылку на ссылаемый диапазон (публичная функция-член) |
|
(C++20) | возвращает итератор начала ссылаемого диапазона (публичная функция-член) |
|
(C++20) | возвращает конечную позицию ссылаемого диапазона (публичная функция-член) |
|
(C++20) | проверяет, пуст ли ссылаемый диапазон (публичная функция-член) |
|
(C++20) | возвращает размер ссылаемого sized_range(публичная функция-член) |
|
(C++20) | возвращает указатель на начало ссылаемого contiguous_range(публичная функция-член) |
Наследуется от |
|
|
(C++23) | возвращает константный итератор начала диапазона. (публичная функция-член std::ranges::view_interface<D>) |
|
(C++23) | возвращает конечную позицию для константного итератора диапазона. (публичная функция-член std::ranges::view_interface<D>) |
|
(C++20) | возвращает, непустой ли производный вид. Предоставляется, если ranges::empty применима к нему.(публичная функция-член std::ranges::view_interface<D>) |
|
(C++20) | возвращает первый элемент производного вида. Предоставляется, если он удовлетворяет forward_range.(публичная функция-член std::ranges::view_interface<D>) |
|
(C++20) | возвращает последний элемент производного вида. Предоставляется, если он удовлетворяет bidirectional_range и common_range.(публичная функция-член std::ranges::view_interface<D>) |
|
(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) |
Инициализирует 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) |
Эквивалентно 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>;
| (с C++20) |
Эквивалентно return ranges::size(*r_);.
std::ranges::ref_view::data
constexpr auto data() const
requires ranges::contiguous_range<R>;
| (с C++20) |
Эквивалентно return ranges::data(*r_);.
Правила вывода
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 <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++.
END_OF_DOCUMENT_MARKER| DR | Применяется к | Поведение, опубликованное | Правильное поведение |
|---|---|---|---|
| P2325R3 | C++20 | конструктор по умолчанию был предоставлен как viewдолжен быть default_initializable | удален вместе с требованием |
См. также
|
(C++11) | CopyConstructible и CopyAssignable обёртка ссылки (шаблон класса) |
|
(C++20) | представление с уникальной собственностью некоторого range (шаблон класса) |
|
(C++20) | представление, содержащее все элементы range(псевдоним шаблона) (объект адаптера диапазонов) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/ranges/ref_view