Namespaces
Variants

std::ranges::rbegin

Начиная с ru.cppreference.net
 
 
Библиотека диапазонов
Адаптеры диапазонов
 
Определён в заголовке <ranges>
Определён в заголовке <iterator>
inline namespace /* unspecified */ {
    inline constexpr /* unspecified */ rbegin = /* unspecified */;
}
(начиная с C++20)
(объект точки настройки)
Сигнатура вызова
template< class T >
    requires /* see below */
constexpr std::input_or_output_iterator auto rbegin( T&& t );
(начиная с C++20)

Возвращает итератор на последний элемент аргумента.

Если T является типом массива, а std::remove_all_extents_t<std::remove_reference_t<T>> неполным, то вызов ranges::rbegin является некорректным, диагностика не требуется.

Если аргумент является lvalue или ranges::enable_borrowed_range<std::remove_cv_t<T>> является true, то вызов ranges::rbegin является эквивалентным выражению:

  1. decay-copy(t.rbegin())(до C++23)auto(t.rbegin())(начиная с C++23), если это выражение корректно и его тип удовлетворяет std::input_or_output_iterator.
  2. В противном случае, decay-copy(rbegin(t))(до C++23)auto(rbegin(t))(начиная с C++23), если T является типом класса или перечисления, это выражение корректно и его тип удовлетворяет std::input_or_output_iterator, причём значение rbegin определяется как если бы выполнялся поиск, зависящий от аргументов только.
  3. В противном случае, std::make_reverse_iterator(ranges::end(t)) если оба выражения ranges::begin(t) и ranges::end(t) корректны, имеют один и тот же тип, и этот тип удовлетворяет std::bidirectional_iterator.

Во всех остальных случаях вызов ranges::rbegin является некорректным, что может привести к ошибке подстановки, когда ranges::rbegin(t) встречается в непосредственном контексте инстанцирования шаблона.

Объекты точек кастомизации

Имя ranges::rbegin обозначает объект точки кастомизации , который является константным функциональным объектом типа литерального semiregular класса. Для подробностей см. CustomizationPointObject .

Примечания

Если аргумент является rvalue (т.е. T является объектным типом) и ranges:: enable_borrowed_range < std:: remove_cv_t < T >> равно false , вызов ranges::rbegin является некорректным, что также приводит к ошибке подстановки.

Возвращаемый тип моделирует std::input_or_output_iterator во всех случаях.

Стандарт C++20 требует, чтобы если базовый вызов функции rbegin возвращает prvalue, возвращаемое значение конструируется перемещением из материализованного временного объекта. Все реализации напрямую возвращают prvalue. Требование исправлено пост-C++20 предложением P0849R8 для соответствия реализациям.

Пример

#include <iostream>
#include <ranges>
#include <span>
#include <vector>
int main()
{
    std::vector<int> v = {3, 1, 4};
    auto vi = std::ranges::rbegin(v);
    std::cout << *vi << '\n';
    *vi = 42; // OK
    int a[] = {-5, 10, 15};
    auto ai = std::ranges::rbegin(a);
    std::cout << *ai << '\n';
    *ai = 42; // OK
    // auto x_x = std::ranges::rbegin(std::vector{6, 6, 6});
    // некорректно: аргумент является rvalue (см. Примечания ↑)
    auto si = std::ranges::rbegin(std::span{a}); // OK
    static_assert(std::ranges::enable_borrowed_range<
        std::remove_cv_t<decltype(std::span{a})>>);
    *si = 42; // OK
}

Вывод:

4
15

Отчеты о дефектах

Следующие отчеты об изменениях поведения, влияющие на дефекты, были применены задним числом к ранее опубликованным стандартам C++.

DR Applied to Behavior as published Correct behavior
P2602R2 C++20 существует механизм для запрета некоторых нечленных rbegin найденных через ADL удалён данный механизм

Смотрите также

возвращает обратный итератор для диапазона только для чтения
(объект точки кастомизации)
возвращает обратный итератор к началу контейнера или массива
(шаблон функции)