Namensräume
Varianten
Aktionen

std::ranges::begin

Von cppreference.com
< cpp‎ | ranges
 
 
Bereichsbibliothek
Range-Adaptoren
 
Definiert in der Header-Datei <ranges>
Definiert in Header <iterator>
inline namespace /* nicht spezifiziert */ {

    inline constexpr /* unbekannt */ begin = /* unbekannt */;

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

    requires /* siehe unten */

constexpr std::input_or_output_iterator auto begin( T&& t );
(seit C++20)

Gibt einen Iterator zum ersten Element des Arguments zurück.

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::begin ausdrucksäquivalent zu

  1. t + 0, wenn t einen Array-Typ hat.
  2. Andernfalls decay-copy(t.begin())(bis C++23)auto(t.begin())(seit C++23), wenn dieser Ausdruck gültig ist und sein Typ std::input_or_output_iterator modelliert.
  3. Andernfalls decay-copy(begin(t))(bis C++23)auto(begin(t))(seit C++23), wenn T ein Klassen- oder Enumerationstyp ist, dieser Ausdruck gültig ist und sein Typ std::input_or_output_iterator modelliert, wobei die Bedeutung von begin wie durch argumentabhängige Suche allein etabliert wird.

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

Inhalt

Customization Point Objects

Der Name ranges::begin bezeichnet ein Customization Point Object, ein konstantes Funktionsobjekt eines literalen semiregular Klassentyps. Zu Ausübungszwecken wird die cv-unqualifizierte Version seines Typs als __begin_fn bezeichnet.

Alle Instanzen von __begin_fn sind gleich. Die Effekte des Aufrufs verschiedener Instanzen des Typs __begin_fn mit denselben Argumenten 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). Daher kann ranges::begin frei kopiert und seine Kopien können austauschbar verwendet werden.

Gegeben sei eine Menge von Typen Args.... Wenn std::declval<Args>()... die obigen Anforderungen für Argumente von ranges::begin erfüllt, modelliert __begin_fn

Andernfalls nimmt kein Funktionsaufrufoperator von __begin_fn an der Überladungsauflösung teil.

[edit] 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, ist der Aufruf von ranges::begin ill-formed, was ebenfalls zu einem Substitutionsfehler führt.

Der Rückgabetyp modelliert in allen Fällen std::input_or_output_iterator.

Der C++20-Standard verlangt, dass bei einem zugrunde liegenden begin-Funktionsaufruf, der ein prvalue zurückgibt, der Rückgabewert aus dem materialisierten temporären Objekt move-konstruiert wird. Alle Implementierungen geben den prvalue stattdessen direkt zurück. Die Anforderung wird durch den Post-C++20-Vorschlag P0849R8 korrigiert, um mit den Implementierungen übereinzustimmen.

[edit] Beispiel

#include <cassert>
#include <ranges>
#include <vector>
 
int main() 
{
    std::vector v{3, 1, 4};
    auto vi = std::ranges::begin(v);
    auto vci = std::ranges::cbegin(v);
    assert(*vi == 3 and *vi == *vci);
    ++vi;
    ++vci; // OK: vci is modifiable object
    *vi = 42; // OK: vi points to mutable element
    // *vci = 13; // Error: vci points to immutable element
 
    int a[]{-5, 10, 15};
    auto ai = std::ranges::begin(a); // works with C-arrays as well
    assert(*ai == -5);
    *ai = 42; // OK
}

[edit] 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 begins, die durch ADL gefunden werden, zu verbieten. solche Mechanismen wurden entfernt.

[edit] Siehe auch

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