Namespaces
Variants

std::ranges:: rbegin

From cppreference.net
Ranges library
Range adaptors
Определено в заголовочном файле <ranges>
Определено в заголовочном файле <iterator>
inline namespace /* unspecified */ {

inline constexpr /* unspecified */ rbegin = /* unspecified */ ;

}
(since C++20)
(объект точки кастомизации)
Сигнатура вызова
template < class T >

requires /* see below */

constexpr std:: input_or_output_iterator auto rbegin ( T && t ) ;
(since C++20)

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

range-rbegin-rend.svg

Если 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 удалён данный механизм

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

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