std::ranges::ssize
| Definiert in der Header-Datei <ranges> |
||
| Definiert in Header <iterator> |
||
| inline namespace /* nicht spezifiziert */ { inline constexpr /* unspecified */ ssize = /* unspecified */; |
(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 und konvertiert das Ergebnis in einen vorzeichenbehafteten Typ.
Gegeben sei der Ausdruckssubbaum, von dem t das (möglicherweise materialisierte) Ergebnisobjekt als E bezeichnet.
- Wenn ranges::size(t) ill-formed ist, ist ranges::ssize(E) ebenfalls ill-formed.
- Andernfalls sei
Signedmake-signed-like-t<decltype(ranges::size(t))>- Wenn std::ptrdiff_t breiter als
Signedist, ist ranges::ssize(E) ausdrucksäquivalent zu static_cast<std::ptrdiff_t>(ranges::size(t)). - Andernfalls ist ranges::ssize(E) ausdrucksäquivalent zu static_cast<Signed>(ranges::size(t)).
- Wenn std::ptrdiff_t breiter als
Inhalt |
Customization Point Objects
Der Name ranges::ssize bezeichnet ein Customization Point Object, ein konstantes Funktionsobjekt eines literalen semiregular-Klassentyps. Zu Auslegungszwecken wird die cv-unqualified Version seines Typs als __ssize_fn bezeichnet.
Alle Instanzen von __ssize_fn sind gleich. Die Auswirkungen des Aufrufs unterschiedlicher Instanzen vom Typ __ssize_fn mit denselben Argumenten sind äquivalent, unabhängig davon, ob der die Instanz bezeichnende Ausdruck 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::ssize frei kopiert und seine Kopien können austauschbar verwendet werden.
Gegeben sei eine Menge von Typen Args.... Wenn std::declval<Args>()... die Anforderungen für Argumente an ranges::ssize gemäß der obigen Beschreibung erfüllen, modelliert __ssize_fn
- std::invocable<__ssize_fn, Args...>,
- std::invocable<const __ssize_fn, Args...>,
- std::invocable<__ssize_fn&, Args...>, und
- std::invocable<const __ssize_fn&, Args...>.
Andernfalls nimmt kein Funktionsaufrufoperator von __ssize_fn an der Überladungsauflösung teil.
[bearbeiten] Hinweise
Wenn ranges::ssize(e) für einen Ausdruck e gültig ist, ist der Rückgabetyp ein signed-integer-like Typ.
[bearbeiten] Beispiel
#include <array> #include <iostream> #include <ranges> #include <type_traits> int main() { std::array arr{1, 2, 3, 4, 5}; auto s = std::ranges::ssize(arr); std::cout << "ranges::ssize(arr) = " << s << '\n' << "ranges::ssize is " << (std::is_signed_v<decltype(s)> ? "signed" : "unsigned") << '\n'; std::cout << "reversed arr: "; for (--s; s >= 0; --s) std::cout << arr[s] << ' '; std::cout << "\n" "s = " << s << '\n'; }
Ausgabe
ranges::ssize(arr) = 5 ranges::ssize is signed reversed arr: 5 4 3 2 1 s = -1
[bearbeiten] 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 |
|---|---|---|---|
| LWG 3403 | C++20 | ranges::size funktionierte für einige Nicht-Range-Typen, aber ranges::ssize nicht. |
funktioniert nun |
[bearbeiten] Siehe auch
| (C++20) |
gibt eine 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) |