Namespaces
Variants

std::ranges::end

Von de.cppreference.net
 
 
Ranges-Bibliothek
Bereichsadaptoren
 
Definiert in Header <ranges>
Definiert in Header <iterator>
inline namespace /* unspecified */ {
    inline constexpr /* unspecified */ end = /* unspecified */;
}
(seit C++20)
(Anpassungspunktobjekt)
Aufrufsignatur
template< class T >
    requires /* see below */
constexpr std::sentinel_for<ranges::iterator_t<T>> auto end( T&& t );
(seit C++20)

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

Wenn das Argument ein L-Wert 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 einen Array-Typ mit bekannter Grenze hat.
    • Wenn std::remove_all_extents_t<std::remove_reference_t<T>> unvollständig ist, dann ist der Aufruf von ranges::end fehlerhaft, keine Diagnose erforderlich.
  2. Andernfalls, decay-copy(t.end())(bis C++23)auto(t.end())(seit C++23), wenn 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), wenn T ein Klassen- oder Aufzählungstyp ist, dieser Ausdruck gültig ist und sein konvertierter Typ std::sentinel_for<ranges::iterator_t<T>> modelliert, wobei die Bedeutung von end so etabliert wird, als ob nur eine argumentabhängige Suche durchgeführt würde.

In allen anderen Fällen ist ein Aufruf von ranges::end fehlerhaft, was zu Substitutionsfehler führen kann, wenn der Aufruf von ranges::end im unmittelbaren Kontext einer Template-Instantiierung erscheint.

Customization Point Objects

Der Name ranges::end bezeichnet ein Customization Point Object , welches ein konstantes Funktionsobjekt eines Literal semiregular Klassentyps ist. Weitere Details finden Sie unter CustomizationPointObject .

Hinweise

Wenn das Argument ein R-Wert ist (d.h. T ist ein Objekttyp) und ranges:: enable_borrowed_range < std:: remove_cv_t < T >> false ist, oder wenn es sich um einen Array-Typ unbekannter Größe handelt, ist der Aufruf von ranges::end fehlerhaft, 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 zugrundeliegende end -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 wurde durch den Post-C++20-Vorschlag P0849R8 korrigiert, um mit den Implementierungen übereinzustimmen.

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!

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 existiert ein Mechanismus, um bestimmte non-member end zu verbieten, die durch ADL gefunden werden Dieser Mechanismus wurde entfernt

Siehe auch

gibt einen Sentinel zurück, der das Ende eines schreibgeschützten Bereichs anzeigt
(Anpassungspunktobjekt)
gibt einen Iterator zum Anfang eines Bereichs zurück
(Anpassungspunktobjekt)
(C++11) (C++14)
gibt einen Iterator zum Ende eines Containers oder Arrays zurück
(Funktionstemplate)