std::ranges::owning_view
Определён в заголовочном файле <ranges> | ||
|---|---|---|
template< ranges::range R >
requires std::movable<R> && (!/*is-initializer-list*/<R>)
class owning_view
: public ranges::view_interface<owning_view<R>>
| (начиная с C++20) |
owning_view — это view, которому принадлежит range на правах исключительного владения. Он допускает только перемещение и хранит этот range внутри себя.
Константа /*is-initializer-list*/<R> в предложении requires является true тогда и только тогда, когда std::remove_cvref_t<R> является специализацией std::initializer_list.
Поля данных
| Член | Описание |
|---|---|
R r_ | базовый диапазон (объект-член только для пояснения*) |
Функции-члены
создаёт owning_view, выполняя инициализацию хранимого диапазона значением по умолчанию или перемещая его (открытая функция-член) |
|
| перемещает значение хранимого диапазона при присваивании (открытая функция-член) |
|
| возвращает ссылку на хранимый диапазон (открытая функция-член) |
|
| возвращает итератор начала хранимого диапазона (открытая функция-член) |
|
| возвращает sentinel хранимого диапазона (открытая функция-член) |
|
| проверяет, пуст ли хранимый диапазон (открытая функция-член) |
|
возвращает размер хранимого sized_range (открытая функция-член) |
|
|
(C++26) | возвращает приблизительный размер хранимого approximately_sized_range (открытая функция-член) |
возвращает указатель на начало хранимого contiguous_range (открытая функция-член) |
|
Унаследовано от |
|
|
(C++23) | возвращает константный итератор на начало диапазона (открытая функция-член std::ranges::view_interface<D>) |
|
(C++23) | возвращает sentinel для константного итератора диапазона (открытая функция-член 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::owning_view::owning_view
owning_view() requires std::default_initializable<R> = default; | (1) | (начиная с C++20) |
owning_view( owning_view&& other ) = default; | (2) | (начиная с C++20) |
constexpr owning_view( R&& t ); | (3) | (начиная с C++20) |
r_ значением по умолчанию с помощью его инициализатора члена по умолчанию (= R()).Параметры
| other | - | другой owning_view, из которого выполняется перемещение |
| t | - | диапазон, из которого выполняется перемещение |
Примечания
owning_view явно не определяет конструктор копирования. owning_view допускает только перемещение.
std::ranges::owning_view::operator=
owning_view& operator=( owning_view&& other ) = default; | (начиная с C++20) |
Оператор присваивания перемещением. Присваивает r_ перемещением из соответствующего объекта other.
Параметры
| other | - | другой owning_view, из которого выполняется перемещение |
Возвращаемое значение
*this
Примечания
owning_view явно не определяет оператор присваивания копированием. owning_view допускает только перемещение.
std::ranges::owning_view::base
constexpr R& base() & noexcept; | (1) | (начиная с C++20) |
constexpr const R& base() const & noexcept; | (2) | (начиная с C++20) |
constexpr R&& base() && noexcept; | (3) | (начиная с C++20) |
constexpr const R&& base() const && noexcept; | (4) | (начиная с C++20) |
Возвращает ссылку на хранимый диапазон, сохраняя категорию значения и квалификатор const.
Возвращаемое значение
r_
std::move(r_ )
std::ranges::owning_view::begin
constexpr ranges::iterator_t<R> begin(); | (1) | (начиная с C++20) |
constexpr auto begin() const requires ranges::range<const R>; | (2) | (начиная с C++20) |
Возвращает ranges::begin(r_ ).
std::ranges::owning_view::end
constexpr ranges::sentinel_t<R> end(); | (1) | (начиная с C++20) |
constexpr auto end() const requires ranges::range<const R>; | (2) | (начиная с C++20) |
Возвращает ranges::end(r_ ).
std::ranges::owning_view::empty
constexpr bool empty() requires requires { ranges::empty(r_); };
| (1) | (начиная с C++20) |
constexpr bool empty() const requires requires { ranges::empty(r_); };
| (2) | (начиная с C++20) |
Возвращает ranges::empty(r_ ).
std::ranges::owning_view::size
constexpr auto size() requires ranges::sized_range<R>; | (1) | (начиная с C++20) |
constexpr auto size() const requires ranges::sized_range<const R>; | (2) | (начиная с C++20) |
Возвращает ranges::size(r_ ).
std::ranges::owning_view::reserve_hint
constexpr auto reserve_hint()
requires ranges::approximately_sized_range<R>;
| (1) | (начиная с C++26) |
constexpr auto reserve_hint() const
requires ranges::approximately_sized_range<const R>;
| (2) | (начиная с C++26) |
Возвращает ranges::reserve_hint(r_ ).
std::ranges::owning_view::data
constexpr auto data() requires ranges::contiguous_range<R>; | (1) | (начиная с C++20) |
constexpr auto data() const requires ranges::contiguous_range<const R>; | (2) | (начиная с C++20) |
Возвращает ranges::data(r_ ).
Вспомогательные шаблоны
template< class T >
constexpr bool enable_borrowed_range<std::ranges::owning_view<T>> =
ranges::enable_borrowed_range<T>;
| (начиная с C++20) |
Эта специализация ranges::enable_borrowed_range позволяет owning_view удовлетворять требованиям borrowed_range, если им удовлетворяет базовый диапазон.
Примечания
| Макрос проверки поддержки функции | Значение | Стандарт | Функция |
|---|---|---|---|
__cpp_lib_ranges_reserve_hint | 202502L | (C++26) |
ranges::approximately_sized_range и reserve_hint |
Пример
#include <cassert>
#include <iostream>
#include <ranges>
#include <string>
int main()
{
using namespace std::literals;
std::ranges::owning_view ov{"cosmos"s}; // the deduced type of R is std::string;
// “ov” is the only owner of this string
assert(
ov.empty() == false &&
ov.size() == 6 &&
ov.size() == ov.base().size() &&
ov.front() == 'c' &&
ov.front() == *ov.begin() &&
ov.back() == 's' &&
ov.back() == *(ov.end() - 1) &&
ov.data() == ov.base()
);
std::cout << "sizeof(ov): " << sizeof ov << '\n' // typically equal to sizeof(R)
<< "range-for: ";
for (const char ch : ov)
std::cout << ch;
std::cout << '\n';
std::ranges::owning_view<std::string> ov2;
assert(ov2.empty());
// ov2 = ov; // compile-time error: copy assignment operator is deleted
ov2 = std::move(ov); // OK
assert(ov2.size() == 6);
}
Возможный вывод:
sizeof(ov): 32 range-for: cosmos
См. также
|
(C++20) | view элементов другого range (шаблон класса) |
|
(C++20) | view, включающее все элементы range(шаблон-алиас) (объект-адаптер диапазонов) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/ranges/owning_view