Namespaces
Variants

std::ranges:: end

From cppreference.net
Ranges library
Range adaptors
Definiert im Header <ranges>
Definiert im Header <iterator>
inline namespace /* unspecified */ {

inline constexpr /* unspecified */ end = /* unspecified */ ;

}
(seit C++20)
(Customization Point Object)
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 anzeigt.

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 > falls t einen Array-Typ mit bekannter Grenze hat.
  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 Enumerationstyp ist, dieser Ausdruck gültig ist und sein konvertierter Typ std:: sentinel_for < ranges:: iterator_t < T >> modelliert, wobei die Bedeutung von end so festgelegt wird, als würde nur argumentabhängige Suche durchgeführt.

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.

Inhaltsverzeichnis

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)