std::ranges::crbegin
Определено в заголовке <ranges> | ||
|---|---|---|
Определено в заголовке <iterator> | ||
inline namespace /* unspecified */ {
inline constexpr /* unspecified */ crbegin = /* unspecified */;
}
| (с C++20) (объект точки кастомизации) | |
| Подпись вызова | ||
template< class T >
requires /* see below */
constexpr /* see below */ auto crbegin( T&& t );
| (с C++20) |
| Возвращает итератор на первый элемент квалифицированного аргумента const, который обрабатывается как обратный ряд. | (до C++23) |
| Возвращает постоянный итератор на первый элемент аргумента, который обрабатывается как обратный ряд. | (с C++23) |
| Пусть
Вызов | (до C++23) |
| Если аргумент является lvalue или
Во всех остальных случаях вызов | (с C++23) |
Тип возвращаемого значения моделирует std::input_or_output_iterator и constant-iterator(с C++23) во всех случаях.
Объекты точки кастомизации
Идентификатор ranges::crbegin обозначает объект точки кастомизации, который является const функциональным объектом типа литерального semiregular класса. Для целей демонстрации неквалифицированная версия его типа обозначается как __crbegin_fn.
Все экземпляры __crbegin_fn равны. Эффекты вызова различных экземпляров типа __crbegin_fn с одинаковыми аргументами эквивалентны, независимо от того, является ли выражение, обозначающее экземпляр, lvalue или rvalue, и квалифицировано ли оно как const (однако не требуется, чтобы квалифицированный volatile экземпляр был вызываемым). Таким образом, ranges::crbegin можно свободно копировать, и его копии можно использовать взаимозаменяемо.
Учитывая набор типов Args..., если std::declval<Args>()... удовлетворяют требованиям к аргументам для ranges::crbegin выше, __crbegin_fn моделирует
-
std::invocable<__crbegin_fn, Args...>, -
std::invocable<const __crbegin_fn, Args...>, -
std::invocable<__crbegin_fn&, Args...>, и -
std::invocable<const __crbegin_fn&, Args...>.
В противном случае, никакой оператор вызова функции __crbegin_fn не участвует в разрешении перегрузки.
Пример
#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})>>
);
}См. также
|
(C++20) | возвращает обратный итератор к диапазону (объект точки кастомизации) |
|
(C++14) | возвращает обратный итератор к началу контейнера или массива (шаблон функции) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/ranges/crbegin