Namespaces
Variants

std::ranges::crbegin

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

Gibt einen Iterator zum ersten Element des mit const qualifizierten Arguments zurück, das als umgekehrte Sequenz behandelt wird.

(bis C++23)

Gibt einen konstanten Iterator zum ersten Element des Arguments zurück, das als umgekehrte Sequenz behandelt wird.

(seit C++23)

Sei CT definiert als

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

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:

  • std::const_iterator<decltype(U)>(U) für einen Ausdruck U, der äquivalent zu ranges::rbegin(possibly-const-range(t)) ist.

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

(seit C++23)

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

Customization Point Objects

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

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-Objekt ist veränderbar
    assert(*vi == 1);
    // *vi = 13; // Fehler: zugrundeliegendes Element ist schreibgeschützt
    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});
    // ungültig: das Argument ist ein Rvalue (siehe Hinweise ↑)
    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})>>
    );
}

Siehe auch

gibt einen Reverse-Iterator für einen Bereich zurück
(Customization Point Object)
gibt einen Reverse-Iterator zum Anfang eines Containers oder Arrays zurück
(Funktionstemplate)