Namensräume
Varianten
Aktionen

std::ranges::crbegin

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 */ crbegin = /* nicht spezifiziert */;

}
(seit C++20)
(Customization-Point-Objekt)
Aufruf-Signatur
template< class T >

    requires /* siehe unten */

constexpr /* siehe unten */ auto crbegin( T&& t );
(seit C++20)

Gibt einen Iterator auf das erste Element des als konstante Folge behandelten Arguments zurück.

(bis C++23)

Gibt einen konstanten Iterator auf das erste Element des als umgekehrte Folge behandelten Arguments zurück.

(seit C++23)

range-rbegin-rend.svg

Sei CT

  • const std::remove_reference_t<T>& wenn das Argument ein lvalue ist (d.h. T ist ein lvalue-Referenztyp),
  • const T andernfalls.

Ein Aufruf von ranges::crbegin ist ausdrucksäquivalent zu ranges::rbegin(static_cast<CT&&>(t)).

(bis C++23)

Wenn das Argument ein lvalue ist oder ranges::enable_borrowed_range<std::remove_cv_t<T>> true ist, dann ist ein Aufruf von ranges::crbegin ausdrucksäquivalent zu

In allen anderen Fällen ist ein Aufruf von ranges::crbegin ill-formed, was zu Substitution Failure führen kann, wenn der Aufruf im unmittelbaren Kontext einer Template-Instanziierung auftritt.

(seit C++23)

Der Rückgabetyp modelliert in allen Fällen std::input_or_output_iterator und constant-iterator(seit C++23).

Customization Point Objects

Der Name ranges::crbegin bezeichnet ein Customization Point Object, welches ein konstantes Funktionsobjekt eines literalen semiregular-Klassentyps ist. Zu Expositionszwecken wird die cv-unqualifizierte Version seines Typs als __crbegin_fn bezeichnet.

Alle Instanzen von __crbegin_fn sind gleich. Die Effekte des Aufrufs verschiedener Instanzen vom Typ __crbegin_fn auf dieselben Argumente sind äquivalent, unabhängig davon, ob der Ausdruck, der die Instanz bezeichnet, ein lvalue oder rvalue ist und ob er mit const qualifiziert ist oder nicht (eine volatile-qualifizierte Instanz muss jedoch nicht aufrufbar sein). Daher kann ranges::crbegin 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 an ranges::crbegin erfüllt, dann modelliert __crbegin_fn

Andernfalls nimmt kein Operator zum Aufrufen von __crbegin_fn an der Overload Resolution teil.

[edit] Beispiel

#include <cassert>
#include <iterator>
#include <span>
#include <vector>
 
int main()
{
    std::vector<int> v{3, 1, 4};
    auto vi = std::ranges::crbegin(v);
    assert(*vi == 4);
    ++vi; // OK, iterator object is mutable
    assert(*vi == 1);
    // *vi = 13; // Error: underlying element is read-only
 
    int a[]{-5, 10, 15};
    auto ai = std::ranges::crbegin(a);
    assert(*ai == 15);
 
    // auto x_x = std::ranges::crbegin(std::vector<int>{6, 6, 6});
    // ill-formed: the argument is an rvalue (see Notes ↑)
 
    auto si = std::ranges::crbegin(std::span{a}); // OK
    assert(*si == 15);
    static_assert
    (
        std::ranges::enable_borrowed_range<std::remove_cv_t<decltype(std::span{a})>>
    );
}

[edit] Siehe auch

gibt einen Reverse-Iterator zu einem Range zurück
(Customization Point Objekt)[edit]
gibt einen Reverse-Iterator zum Anfang eines Containers oder Arrays zurück
(function template) [bearbeiten]