Namensräume
Varianten
Aktionen

std::ranges::end

Von cppreference.com
< cpp‎ | ranges
 
 
Bereichsbibliothek
Range-Adaptoren
 
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 */

constexpr std::sentinel_for<ranges::iterator_t<T>> auto end( T&& t );
(seit C++20)

Gibt ein Sentinel zurück, das das Ende eines Bereichs angibt.

range-begin-end.svg

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

  1. t + std::extent_v<T>, wenn t ein Array-Typ mit bekannter Grenze ist.
  2. 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.
  3. Andernfalls decay-copy(end(t))(bis C++23)auto(end(t))(seit C++23), falls T ein 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 von end durch 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

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

gibt ein Sentinel zurück, das das Ende eines schreibgeschützten Ranges anzeigt
(Customization Point Objekt)[edit]
gibt einen Iterator zum Anfang eines Ranges zurück
(Customization Point Objekt)[edit]
(C++11)(C++14)
gibt einen Iterator zum Ende eines Containers oder Arrays zurück
(Funktionsvorlage) [bearbeiten]