std::ranges::crbegin
| Defined in header <ranges>
|
||
| Defined in header <iterator>
|
||
inline namespace /* unspecified */ { inline constexpr /* unspecified */ crbegin = /* unspecified */; } |
(since C++20) (customization point object) |
|
| Call signature |
||
template< class T > requires /* see below */ constexpr /* see below */ auto crbegin( T&& t ); |
(since C++20) | |
|
Returns an iterator to the first element of the const-qualified argument that is treated as a reversed sequence. |
(until C++23) |
|
Returns a constant iterator to the first element of the argument that is treated as a reversed sequence. |
(since C++23) |
|
Let
A call to |
(until C++23) |
|
If the argument is an lvalue or
In all other cases, a call to |
(since C++23) |
The return type models std::input_or_output_iterator and constant-iterator(since C++23) in all cases.
Customization point objects
The name ranges::crbegin denotes a customization point object, which is a const function object of a literal semiregular class type. See CustomizationPointObject for details.
Example
#include <cassert>
#include <iterator>
#include <span>
#include <vector>
int main()
{
std::vector<int> v{3, 1, 4};
auto vi = std::ranges::crbegin(v);
assert(*vi == 4);
++vi; // OK, iterator object is mutable
assert(*vi == 1);
// *vi = 13; // Error: underlying element is read-only
int a[]{-5, 10, 15};
auto ai = std::ranges::crbegin(a);
assert(*ai == 15);
// auto x_x = std::ranges::crbegin(std::vector<int>{6, 6, 6});
// ill-formed: the argument is an rvalue (see Notes ↑)
auto si = std::ranges::crbegin(std::span{a}); // OK
assert(*si == 15);
static_assert
(
std::ranges::enable_borrowed_range<std::remove_cv_t<decltype(std::span{a})>>
);
}
See also
(C++20) |
returns a reverse iterator to a range (customization point object) |
(C++14) |
returns a reverse iterator to the beginning of a container or array (function template) |