std::ranges::data
| Definiert in der Header-Datei <ranges> |
||
| Definiert in Header <iterator> |
||
| inline namespace /* nicht spezifiziert */ { inline constexpr /* nicht spezifiziert */ data = /* nicht spezifiziert */; |
(seit C++20) (Customization-Point-Objekt) |
|
| Aufruf-Signatur |
||
| template< class T > requires /* siehe unten */ |
(seit C++20) | |
Gibt einen Zeiger auf das erste Element eines zusammenhängenden Bereichs zurück.
Wenn T ein Array-Typ ist und std::remove_all_extents_t<std::remove_reference_t<T>> unvollständig ist, dann ist der Aufruf von ranges::data ill-formed, keine Diagnose erforderlich.
Wenn das Argument ein lvalue ist oder ranges::enable_borrowed_range<std::remove_cv_t<T>> true ist, ist ein Aufruf von ranges::data ausdrucksäquivalent zu
- decay-copy(t.data())(bis C++23)auto(t.data())(seit C++23), wenn dieser Ausdruck gültig ist und sein Typ ein Zeiger auf einen Objekttyp ist.
- Andernfalls std::to_address(ranges::begin(t)), wenn der Ausdruck ranges::begin(t) gültig ist und sein Typ std::contiguous_iterator modelliert.
In allen anderen Fällen ist ein Aufruf von ranges::data ill-formed, was zu einem Substitutionsfehler führen kann, wenn ranges::data(e) im unmittelbaren Kontext einer Template-Instanziierung erscheint.
Inhalt |
Customization Point Objects
Der Name ranges::data bezeichnet ein Customization Point Object, ein konstantes Funktionsobjekt eines literalen semiregular Klassentyps. Zu Auslegungszwecken wird die cv-unqualifizierte Version seines Typs als __data_fn bezeichnet.
Alle Instanzen von __data_fn sind gleich. Die Effekte des Aufrufs verschiedener Instanzen des Typs __data_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::data 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::data wie oben erfüllt, modelliert __data_fn
- std::invocable<__data_fn, Args...>,
- std::invocable<const __data_fn, Args...>,
- std::invocable<__data_fn&, Args...>, und
- std::invocable<const __data_fn&, Args...>.
Andernfalls nimmt kein Funktionsaufrufoperator von __data_fn an der Überladungsauflösung teil.
[edit] Hinweise
Wenn das Argument ein rvalue ist (d.h. T ein Objekttyp ist) und ranges::enable_borrowed_range<std::remove_cv_t<T>> false ist, ist der Aufruf von ranges::data ill-formed, was ebenfalls zu einem Substitutionsfehler führt.
Wenn ranges::data(e) für einen Ausdruck e gültig ist, dann gibt er einen Zeiger auf ein Objekt zurück.
Der C++20-Standard verlangt, dass, wenn die zugrunde liegende data-Funktion 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 wird durch den Post-C++20-Vorschlag P0849R8 korrigiert, um mit den Implementierungen übereinzustimmen.
[edit] Beispiel
#include <cstring> #include <iostream> #include <ranges> #include <string> int main() { std::string s{"Hello world!\n"}; char a[20]; // storage for a C-style string std::strcpy(a, std::ranges::data(s)); // [data(s), data(s) + size(s)] is guaranteed to be an NTBS std::cout << a; }
Ausgabe
Hello world!
[edit] Siehe auch
| (C++20) |
ruft einen Zeiger auf den Anfang eines schreibgeschützten zusammenhängenden Ranges ab (Customization Point Objekt) |
| (C++20) |
gibt einen Iterator zum Anfang eines Ranges zurück (Customization Point Objekt) |
| (C++17) |
erhält den Zeiger auf das zugrundeliegende Array (function template) |