std::ranges::begin
| 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 */ |
(seit C++20) | |
Gibt einen Iterator zum ersten Element des Arguments zurück.
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
- t + 0, wenn t einen Array-Typ hat.
- Wenn std::remove_all_extents_t<std::remove_reference_t<T>> unvollständig ist, dann ist der Aufruf von
ranges::beginill-formed (fehlerhaft formuliert), keine Diagnose erforderlich.
- Wenn std::remove_all_extents_t<std::remove_reference_t<T>> unvollständig ist, dann ist der Aufruf von
- 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.
- Andernfalls decay-copy(begin(t))(bis C++23)auto(begin(t))(seit C++23), wenn
Tein Klassen- oder Enumerationstyp ist, dieser Ausdruck gültig ist und sein Typ std::input_or_output_iterator modelliert, wobei die Bedeutung vonbeginwie 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
- std::invocable<__begin_fn, Args...>,
- std::invocable<const __begin_fn, Args...>,
- std::invocable<__begin_fn&, Args...>, und
- std::invocable<const __begin_fn&, Args...>.
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
| (C++20) |
gibt einen Iterator zum Anfang eines schreibgeschützten Ranges zurück (Customization Point Objekt) |
| (C++11)(C++14) |
gibt einen Iterator zum Anfang eines Containers oder Arrays zurück (Funktionsvorlage) |