std::ranges::rbegin
| 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 */ |
(seit C++20) | |
Gibt einen Iterator zum letzten Element des Arguments zurück.
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
- 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.
- Andernfalls, decay-copy(rbegin(t))(until C++23)auto(rbegin(t))(since C++23), wenn
Tein Klassen- oder Enumerationstyp ist, dieser Ausdruck gültig ist und sein Typ std::input_or_output_iterator modelliert, wobei die Bedeutung vonrbeginso etabliert wird, als ob durch die Durchführung von argumentabhängiger Suche ausschließlich. - 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
- std::invocable<__rbegin_fn, Args...>,
- std::invocable<const __rbegin_fn, Args...>,
- std::invocable<__rbegin_fn&, Args...>, und
- std::invocable<const __rbegin_fn&, Args...>.
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
| (C++20) |
gibt einen Reverse-Iterator zu einem schreibgeschützten Range zurück (Customization Point Objekt) |
| (C++14) |
gibt einen Reverse-Iterator zum Anfang eines Containers oder Arrays zurück (function template) |