std::ranges::end
| Definiert in der Header-Datei <ranges> |
||
| Definiert in Header <iterator> |
||
| inline namespace /* nicht spezifiziert */ { inline constexpr /* nicht spezifiziert */ end = /* nicht spezifiziert */; |
(seit C++20) (Customization-Point-Objekt) |
|
| Aufruf-Signatur |
||
| template< class T > requires /* siehe unten */ |
(seit C++20) | |
Gibt ein Sentinel zurück, das das Ende eines Bereichs angibt.
Wenn das Argument ein lvalue ist oder ranges::enable_borrowed_range<std::remove_cv_t<T>> true ist, dann ist ein Aufruf von ranges::end ausdrucksäquivalent zu
- t + std::extent_v<T>, wenn t ein Array-Typ mit bekannter Grenze ist.
- Wenn std::remove_all_extents_t<std::remove_reference_t<T>> unvollständig ist, dann ist der Aufruf von
ranges::endill-formed, keine Diagnose erforderlich.
- Wenn std::remove_all_extents_t<std::remove_reference_t<T>> unvollständig ist, dann ist der Aufruf von
- Andernfalls decay-copy(t.end())(bis C++23)auto(t.end())(seit C++23), falls dieser Ausdruck gültig ist und sein Typ std::sentinel_for<ranges::iterator_t<T>> modelliert.
- Andernfalls decay-copy(end(t))(bis C++23)auto(end(t))(seit C++23), falls
Tein Klassen- oder Aufzählungstyp ist, ist dieser Ausdruck gültig und sein konvertierter Typ modelliert std::sentinel_for<ranges::iterator_t<T>>, wobei die Bedeutung vonenddurch die Durchführung einer argumentabhängigen Suche (ADL) allein festgelegt wird.
In allen anderen Fällen ist ein Aufruf von ranges::end ill-formed, was zu einem Substitutionsfehler führen kann, wenn der Aufruf von ranges::end im unmittelbaren Kontext einer Template-Instanziierung erscheint.
Inhalt |
Customization Point Objects
Der Name ranges::end bezeichnet ein Customization Point Object (CPO), d. h. ein konstantes Funktionsobjekt eines literal-semiregular Klassentyps. Zu Aussetzungszwecken wird die cv-unqualifizierte Version seines Typs als __end_fn bezeichnet.
Alle Instanzen von __end_fn sind gleich. Die Auswirkungen der Invokation unterschiedlicher Instanzen vom Typ __end_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). Somit kann ranges::end frei kopiert werden und seine Kopien können austauschbar verwendet werden.
Gegeben eine Menge von Typen Args..., wenn std::declval<Args>()... die obigen Anforderungen für Argumente an ranges::end erfüllen, dann modelliert __end_fn
- std::invocable<__end_fn, Args...>,
- std::invocable<const __end_fn, Args...>,
- std::invocable<__end_fn&, Args...> und
- std::invocable<const __end_fn&, Args...>.
Andernfalls nimmt kein operator() von __end_fn an der Überladungsauflösung teil.
[bearbeiten] Anmerkungen
Wenn das Argument ein rvalue ist (d. h. T ist ein Objekttyp) und ranges::enable_borrowed_range<std::remove_cv_t<T>> false ist oder wenn es von einem Array-Typ unbekannter Bindung ist, ist der Aufruf von ranges::end ill-formed, was ebenfalls zu einem Substitutionsfehler führt.
Wenn ranges::end(std::forward<T>(t)) gültig ist, dann modellieren decltype(ranges::end(std::forward<T>(t))) und decltype(ranges::begin(std::forward<T>(t))) in allen Fällen std::sentinel_for, während T std::ranges::range modelliert.
Der C++20-Standard verlangt, dass, wenn der zugrunde liegende end-Funktionsaufruf ein 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 den Implementierungen zu entsprechen.
[bearbeiten] Beispiel
#include <algorithm> #include <iostream> #include <ranges> #include <vector> int main() { std::vector<int> vec{3, 1, 4}; if (std::ranges::find(vec, 5) != std::ranges::end(vec)) std::cout << "found a 5 in vector vec!\n"; int arr[]{5, 10, 15}; if (std::ranges::find(arr, 5) != std::ranges::end(arr)) std::cout << "found a 5 in array arr!\n"; }
Ausgabe
found a 5 in array arr!
[bearbeiten] 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-end-Funktionen, die durch ADL gefunden werden, zu verbieten. |
solche Mechanismen wurden entfernt. |
[bearbeiten] Siehe auch
| (C++20) |
gibt ein Sentinel zurück, das das Ende eines schreibgeschützten Ranges anzeigt (Customization Point Objekt) |
| (C++20) |
gibt einen Iterator zum Anfang eines Ranges zurück (Customization Point Objekt) |
| (C++11)(C++14) |
gibt einen Iterator zum Ende eines Containers oder Arrays zurück (Funktionsvorlage) |