Namensräume
Varianten
Aktionen

std::ranges::ssize

Von cppreference.com
< cpp‎ | ranges
 
 
Bereichsbibliothek
Range-Adaptoren
 
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 */

constexpr auto ssize( T&& t );
(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.

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

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

gibt eine Ganzzahl zurück, die der Größe eines Ranges entspricht
(Customization Point Objekt)[edit]
spezifiziert, dass ein Range seine Größe in konstanter Zeit kennt
(Konzept) [edit]
gibt die Distanz zwischen einem Iterator und einem Sentinel zurück oder die Distanz zwischen dem Anfang und dem Ende eines Bereichs
(Algorithmus-Funktionsobjekt)[bearbeiten]
(C++17)(C++20)
gibt die Größe eines Containers oder Arrays zurück
(Funktionsvorlage) [bearbeiten]