Namensräume
Varianten
Aktionen

std::ranges::rbegin

Von cppreference.com
< cpp‎ | ranges
 
 
Bereichsbibliothek
Range-Adaptoren
 
Definiert in der Header-Datei <ranges>
Definiert in Header <iterator>
inline namespace /* nicht spezifiziert */ {

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

}
(seit C++20)
(Customization-Point-Objekt)
Aufruf-Signatur
template< class T >

    requires /* siehe unten */

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

Gibt einen Iterator zum letzten Element des Arguments zurück.

range-rbegin-rend.svg

Wenn T ein Array-Typ ist und std::remove_all_extents_t<std::remove_reference_t<T>> unvollständig ist, ist der Aufruf von ranges::rbegin ill-formed, keine Diagnose erforderlich.

Wenn das Argument ein lvalue ist oder ranges::enable_borrowed_range<std::remove_cv_t<T>> true ist, dann ist ein Aufruf von ranges::rbegin ausdrucksäquivalent zu

  1. decay-copy(t.rbegin())(until C++23)auto(t.rbegin())(since C++23), wenn dieser Ausdruck gültig ist und sein Typ std::input_or_output_iterator modelliert.
  2. Andernfalls, decay-copy(rbegin(t))(until C++23)auto(rbegin(t))(since C++23), wenn T ein Klassen- oder Enumerationstyp ist, dieser Ausdruck gültig ist und sein Typ std::input_or_output_iterator modelliert, wobei die Bedeutung von rbegin so etabliert wird, als ob durch die Durchführung von argumentabhängiger Suche ausschließlich.
  3. Andernfalls, std::make_reverse_iterator(ranges::end(t)), wenn sowohl ranges::begin(t) als auch ranges::end(t) gültige Ausdrücke sind, denselben Typ haben und dieser Typ std::bidirectional_iterator modelliert.

In allen anderen Fällen ist ein Aufruf von ranges::rbegin ill-formed, was zu einem Substitutionsfehler führen kann, wenn ranges::rbegin(t) im unmittelbaren Kontext einer Templatinstanziierung erscheint.

Inhalt

Customization Point Objects

Der Name ranges::rbegin bezeichnet ein Customization Point Object, ein konstantes Funktionsobjekt eines literalen semiregular-Klassentyps. Zu Ausstellungszwecken wird die cv-unqualifiede Version seines Typs als __rbegin_fn bezeichnet.

Alle Instanzen von __rbegin_fn sind gleich. Die Effekte der Aufrufe unterschiedlicher Instanzen vom Typ __rbegin_fn auf dieselben Argumente sind äquivalent, unabhängig davon, ob der Ausdruck, der die Instanz bezeichnet, ein lvalue oder rvalue ist und ob er const-qualifiziert ist oder nicht (eine volatile-qualifizierte Instanz muss jedoch nicht aufrufbar sein). Daher kann ranges::rbegin frei kopiert werden und seine Kopien können austauschbar verwendet werden.

Gegeben eine Menge von Typen Args..., wenn std::declval<Args>()... die Anforderungen für Argumente von ranges::rbegin oben erfüllt, modelliert __rbegin_fn

Andernfalls nimmt kein Funktionsaufrufoperator von __rbegin_fn an der Überladungsauflösung teil.

[edit] Hinweise

Wenn das Argument ein rvalue ist (d. h. T ein Objekttyp ist) und ranges::enable_borrowed_range<std::remove_cv_t<T>> false ist, ist der Aufruf von ranges::rbegin ill-formed, was ebenfalls zu einem Substitutionsfehler führt.

Der Rückgabetyp modelliert in allen Fällen std::input_or_output_iterator.

Der C++20-Standard verlangt, dass, wenn der zugrunde liegende rbegin-Funktionsaufruf einen prvalue zurückgibt, der Rückgabewert aus dem materialisierten temporären Objekt move-konstruiert wird. Alle Implementierungen geben stattdessen direkt den prvalue zurück. Die Anforderung wird durch den Post-C++20-Vorschlag P0849R8 korrigiert, um die Implementierungen abzugleichen.

[edit] Beispiel

#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});
    // ill-formed: the argument is an rvalue (see Notes ↑)
 
    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
}

Ausgabe

4
15

[edit] Fehlerberichte

Die folgenden Verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.

DR angewendet auf Verhalten wie veröffentlicht Korrigiertes Verhalten
P2602R2 C++20 Es gibt Mechanismen, um bestimmte Nicht-Member-rbegin zu verbieten, die über ADL gefunden werden. solche Mechanismen wurden entfernt.

[edit] Siehe auch

gibt einen Reverse-Iterator zu einem schreibgeschützten Range zurück
(Customization Point Objekt)[edit]
gibt einen Reverse-Iterator zum Anfang eines Containers oder Arrays zurück
(function template) [bearbeiten]