std::ranges::owning_view(3)

NAME
std::ranges::owning_view - std::ranges::owning_view

Synopsis
   Defined in header <ranges>
   template< ranges::range R >
       requires std::movable<R> && (!/*is-initializer-list*/<R>) (since C++20)
   class owning_view
       : public ranges::view_interface<owning_view<R>>
   owning_view is a view that has unique ownership of a range. It is move-only and
   stores that range within it.
   The constant /*is-initializer-list*/<R> in the requires-clause is true if and only
   if std::remove_cvref_t<R> is a specialization of std::initializer_list.

Member functions
   constructor constructs an owning_view by value-initializing or move-constructing
   (C++20) the stored range
                 (public member function)
   operator= move-assigns the stored range
   (C++20) (public member function)
   base returns a reference to the stored range
   (C++20) (public member function)
   begin returns the beginning iterator of the stored range
   (C++20) (public member function)
   end returns the sentinel of the stored range
   (C++20) (public member function)
   empty checks whether the stored range is empty
   (C++20) (public member function)
   size returns the size of the stored sized_range
   (C++20) (public member function)
   data returns the pointer to the beginning of the stored contiguous_range
   (C++20) (public member function)
         Inherited from std::ranges::view_interface
   cbegin returns a constant iterator to the beginning of the range.
   (C++23) (public member function of std::ranges::view_interface<D>)
   cend returns a sentinel for the constant iterator of the range.
   (C++23) (public member function of std::ranges::view_interface<D>)
   operator bool returns whether the derived view is not empty. Provided if
   (C++20) ranges::empty is applicable to it.
                 (public member function of std::ranges::view_interface<D>)
   front returns the first element in the derived view. Provided if it
   (C++20) satisfies forward_range.
                 (public member function of std::ranges::view_interface<D>)
   back returns the last element in the derived view. Provided if it satisfies
   (C++20) bidirectional_range and common_range.
                 (public member function of std::ranges::view_interface<D>)
   operator[] returns the n^th element in the derived view. Provided if it satisfies
   (C++20) random_access_range.
                 (public member function of std::ranges::view_interface<D>) std::ranges::owning_view::owning_view
   owning_view() requires std::default_initializable<R> = default; (1) (since C++20)
   owning_view( owning_view&& other ) = default; (2) (since C++20)
   constexpr owning_view( R&& t ); (3) (since C++20)
   owning_view( const owning_view& ) = delete; (4) (since C++20)
   1) Default constructor. Value-initializes the stored range by its default member
   initializer (= R()).
   2) Move constructor. Move constructs the stored range from that of other.
   3) Move constructs the stored range from t.
   4) Copy constructor is deleted. owning_view is move-only.

Parameters
   other - another owning_view to move from
   t - range to move from std::ranges::owning_view::operator=
   owning_view& operator=( owning_view&& other ) = default; (1) (since C++20)
   owning_view& operator=( const owning_view& ) = delete; (2) (since C++20)
   1) Move assignment operator. Move assigns the stored range from that of other.
   2) Copy assignment operator is deleted. owning_view is move-only.

Parameters
   other - another owning_view to move from

Return value
   *this std::ranges::owning_view::base
   constexpr R& base() & noexcept; (1) (since C++20)
   constexpr const R& base() const & noexcept; (2) (since C++20)
   constexpr R&& base() && noexcept; (3) (since C++20)
   constexpr const R&& base() const && noexcept; (4) (since C++20)
   Returns a reference to the stored range, keeping value category and
   const-qualification.
   1,2) Equivalent to return r_;.
   3,4) Equivalent to return std::move(r_);. std::ranges::owning_view::begin
   constexpr ranges::iterator_t<R> begin(); (1) (since C++20)
   constexpr auto begin() const requires ranges::range<const R>; (2) (since C++20)
   Equivalent to return ranges::begin(r_);. std::ranges::owning_view::end
   constexpr ranges::sentinel_t<R> end(); (1) (since C++20)
   constexpr auto end() const requires ranges::range<const R>; (2) (since C++20)
   Equivalent to return ranges::end(r_);. std::ranges::owning_view::empty
   constexpr bool empty() requires requires { ranges::empty(r_); }; (1) (since C++20)
   constexpr bool empty() const requires requires { (2) (since C++20)
   ranges::empty(r_); };
   Equivalent to return ranges::empty(r_);. std::ranges::owning_view::size
   constexpr auto size() requires ranges::sized_range<R>; (1) (since C++20)
   constexpr auto size() const requires ranges::sized_range<const R>; (2) (since C++20)
   Equivalent to return ranges::size(r_);. std::ranges::owning_view::data
   constexpr auto data() requires ranges::contiguous_range<R>; (1) (since C++20)
   constexpr auto data() const requires (2) (since C++20)
   ranges::contiguous_range<const R>;
   Equivalent to return ranges::data(r_);.
   Helper templates
   template< class T >
   inline constexpr bool (since C++20)
   enable_borrowed_range<std::ranges::owning_view<T>> =
       std::ranges::enable_borrowed_range<T>;
   This specialization of std::ranges::enable_borrowed_range makes owning_view satisfy
   borrowed_range when the underlying range satisfies it.

Example
// Run this code
 #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);
 }

Possible output:
 sizeof(ov): 32
 range-for: cosmos

See also
   ranges::ref_view a view of the elements of some other range
   (C++20) (class template)
   views::all_t a view that includes all elements of a range
   views::all (alias template) (range adaptor object)
   (C++20)