std::ranges::Größe
| Definiert in der Header-Datei <ranges> |
||
| Definiert in Header <iterator> |
||
| inline namespace /* nicht spezifiziert */ { inline constexpr auto size = /* nicht spezifiziert */; |
(seit C++20) (Customization-Point-Objekt) |
|
| Aufruf-Signatur |
||
| template< class T > requires /* siehe unten */ |
(seit C++20) | |
Berechnet die Anzahl der Elemente in t in konstanter Zeit.
Gegeben die Subexpression, deren (möglicherweise materialisiertes) Ergebnisobjekt t bezeichnet, als E, und den Typ von E als T
- Wenn
Tein Array unbekannter Größe ist, ist ranges::size(E) fehlerhaft. - Andernfalls, wenn
Tein Array-Typ ist, ist ranges::size(E) ausdrucksäquivalent zu decay-copy (std::extent_v<T>)(bis C++23)auto(std::extent_v<T>)(seit C++23). - Andernfalls, wenn alle folgenden Bedingungen erfüllt sind, ist ranges::size(E) ausdrucksäquivalent zu decay-copy (t.size())(bis C++23)auto(t.size())(seit C++23).
- ranges::disable_sized_range<std::remove_cv_t<T>> ist false.
- decay-copy (t.size())(bis C++23)auto(t.size())(seit C++23) ist ein gültiger Ausdruck vom integer-ähnlichen Typ.
- Andernfalls, wenn alle folgenden Bedingungen erfüllt sind, ist ranges::size(E) ausdrucksäquivalent zu decay-copy (size(t))(bis C++23)auto(size(t))(seit C++23).
-
Tist ein Klassen- oder Aufzählungstyp. - ranges::disable_sized_range<std::remove_cv_t<T>> ist false.
- decay-copy (size(t))(bis C++23)auto(size(t))(seit C++23) ist ein gültiger Ausdruck vom integer-ähnlichen Typ, wobei die Bedeutung von
sizeso etabliert wird, als würde argumentabhängige Suche durchgeführt.
-
- Andernfalls, wenn alle folgenden Bedingungen erfüllt sind, ist ranges::size(E) ausdrucksäquivalent zu
to-unsigned-like(ranges::end(t) - ranges::begin(t))-
Tmodelliertforward_range. - Gegeben den Typ von ranges::begin(t) als
Iund den Typ von ranges::end(t) alsS, werden sowohlsized_sentinel_for<S, I> als auchforward_iterator<I> modelliert. -
to-unsigned-like(ranges::end(t) - ranges::begin(t)) ist ein gültiger Ausdruck.
-
- Andernfalls ist ranges::size(E) fehlerhaft.
Diagnostizierbare fehlerhafte Fälle führen zu Substitutionsfehlern, wenn ranges::size(E) im unmittelbaren Kontext einer Template-Instanziierung erscheint.
Inhalt |
Customization Point Objects
Der Name ranges::size bezeichnet ein Customization Point Object, ein konstantes Funktionsobjekt eines literalen semiregular-Klassentyps. Zu Ausübungszwecken wird die cv-unqualifizierte Version seines Typs als __size_fn bezeichnet.
Alle Instanzen von __size_fn sind gleich. Die Auswirkungen des Aufrufs verschiedener Instanzen des Typs __size_fn auf dieselben Argumente 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::size frei kopiert werden und seine Kopien sind austauschbar.
Gegeben eine Menge von Typen Args..., wenn std::declval<Args>()... die oben genannten Anforderungen für Argumente von ranges::size erfüllt, modelliert __size_fn
- std::invocable<__size_fn, Args...>,
- std::invocable<const __size_fn, Args...>,
- std::invocable<__size_fn&, Args...>, und
- std::invocable<const __size_fn&, Args...>.
Andernfalls nimmt kein operator() von __size_fn an der Überladungsauflösung teil.
[bearbeiten] Hinweise
Immer wenn ranges::size(e) für einen Ausdruck e gültig ist, ist der Rückgabetyp integer-ähnlich.
Der C++20-Standard verlangt, dass, wenn der zugrunde liegende size-Funktionsaufruf einen 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 die Implementierungen anzupassen.
Der Ausdruck ranges::distance(e) kann ebenfalls verwendet werden, um die Größe eines Bereichs e zu ermitteln. Im Gegensatz zu ranges::size(e) funktioniert ranges::distance(e) auch dann, wenn e ein unsized range ist, allerdings auf Kosten einer linearen Komplexität in diesem Fall.
[bearbeiten] Beispiel
#include <iostream> #include <ranges> #include <type_traits> #include <vector> int main() { auto v = std::vector<int>{}; std::cout << "ranges::size(v) == " << std::ranges::size(v) << '\n'; auto il = {7}; // std::initializer_list std::cout << "ranges::size(il) == " << std::ranges::size(il) << '\n'; int array[]{4, 5}; // array has a known bound std::cout << "ranges::size(array) == " << std::ranges::size(array) << '\n'; static_assert(std::is_signed_v<decltype(std::ranges::size(v))> == false); }
Ausgabe
ranges::size(v) == 0 ranges::size(il) == 1 ranges::size(array) == 2
[bearbeiten] Defect reports
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-size, die von ADL gefunden werden, zu verbieten |
solche Mechanismen wurden entfernt. |
[bearbeiten] Siehe auch
| (C++20) |
gibt eine vorzeichenbehaftete Ganzzahl zurück, die der Größe eines Ranges entspricht (Customization Point Objekt) |
| (C++20) |
spezifiziert, dass ein Range seine Größe in konstanter Zeit kennt (Konzept) |
| (C++20) |
gibt die Distanz zwischen einem Iterator und einem Sentinel zurück oder die Distanz zwischen dem Anfang und dem Ende eines Bereichs (Algorithmus-Funktionsobjekt) |
| (C++17)(C++20) |
gibt die Größe eines Containers oder Arrays zurück (Funktionsvorlage) |