Scroll to navigation

std::ranges::ref_view(3) C++ Standard Libary std::ranges::ref_view(3)

NAME

std::ranges::ref_view - std::ranges::ref_view

Synopsis


Defined in header <ranges>
template<ranges::range R>


requires std::is_object_v<R> (since C++20)


class ref_view : public ranges::view_interface<ref_view<R>>


ref_view is a view of the elements of some other range. It wraps a reference to that
range.


Data members


ref_view behaves as if it only stores a R* member subobject pointing to the
referenced range. The member is shown as r_ here (the name is exposition-only).

Member functions


constructor constructs a ref_view that references to the given range
(C++20) (public member function)
base returns the references to the referenced range
(C++20) (public member function)
begin returns the beginning iterator of the referenced range
(C++20) (public member function)
end returns the sentinel of the referenced range
(C++20) (public member function)
empty checks whether the referenced range is empty
(C++20) (public member function)
size returns the size of the referenced sized_range
(C++20) (public member function)
data returns the pointer to the beginning of the referenced
(C++20) contiguous_range
(public member function)
Inherited from std::ranges::view_interface
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 nth 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::ref_view::ref_view


template</*different-from*/<ref_view> T>


requires std::convertible_to<T, R&> && requires { (since C++20)
_FUN(std::declval<T>()); }


constexpr ref_view(T&& t);


Initializes r_ with std::addressof(static_cast<R&>(std::forward<T>(t))).


/*different-from*/<T, U> is satisfied if and only if std::remove_cvref_t<T> and
std::remove_cvref_t<U> are not the same type, and overloads of _FUN are declared as
void _FUN(R&); void _FUN(R&&) = delete;.

Parameters


t - range to reference

std::ranges::ref_view::base


constexpr R& base() const; (since C++20)


Equivalent to return *r_;

std::ranges::ref_view::begin


constexpr ranges::iterator_t<R> begin() const; (since C++20)


Equivalent to return ranges::begin(*r_);

std::ranges::ref_view::end


constexpr ranges::sentinel_t<R> end() const; (since C++20)


Equivalent to return ranges::end(*r_);

std::ranges::ref_view::empty


constexpr bool empty() const (since C++20)
requires requires { ranges::empty(*r_); };


Equivalent to return ranges::empty(*r_);

std::ranges::ref_view::size


constexpr auto size() const


requires ranges::sized_range<R> (since C++20)


{ return ranges::size(*r_); }

std::ranges::ref_view::data


constexpr auto data() const


requires ranges::contiguous_range<R> (since C++20)


{ return ranges::data(*r_); }


Deduction guides


template<class R> (since C++20)
ref_view(R&) -> ref_view<R>;


Helper templates


template<class T>
inline constexpr bool enable_borrowed_range<ranges::ref_view<T>> = (since C++20)
true;


This specialization of std::ranges::enable_borrowed_range makes ref_view satisfy
borrowed_range.

Example

// Run this code


#include <ranges>
#include <iostream>


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';
}

Output:


call empty() : false
call size() : 3
call begin() : c
call end() : s
call data() : cosmos
call base() : 3
range-for : cos


Defect reports


The following behavior-changing defect reports were applied retroactively to
previously published C++ standards.


DR Applied to Behavior as published Correct behavior
default constructor was provided as removed along with the
P2325R3 C++20 view requirement
must be default_initializable

See also


reference_wrapper CopyConstructible and CopyAssignable reference wrapper
(C++11) (class template)
ranges::owning_view a view with unique ownership of some 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)

2022.07.31 http://cppreference.com