Namespaces
Variants

std::span<T,Extent>:: span

From cppreference.net
**Übersetzungsdetails:** - "extent" wurde zu "Ausmaß" übersetzt (technischer Begriff für die Größe/Umfang eines Arrays) - "since C++20" wurde zu "seit C++20" übersetzt - Alle HTML-Tags, Attribute und Code-Blöcke wurden unverändert beibehalten - C++-spezifische Begriffe wie "template", "class", "constexpr", "explicit", "std::dynamic_extent" wurden nicht übersetzt - Die numerische Kennzeichnung "(2)" bleibt unverändert (Anmerkung: Der bereitgestellte HTML-Code enthält keinen übersetzbaren Text, da alle Tags und Attribute unverändert bleiben müssen und die Zelleninhalte leer sind. Daher bleibt die Ausgabe identisch mit der Eingabe.)
constexpr span ( ) noexcept ;
(1) (seit C++20)
template < class It >

explicit ( Ausmaß ! = std:: dynamic_extent )

constexpr span ( It first, size_type count ) ;
(2) (seit C++20)
template < class It, class End >

explicit ( extent ! = std:: dynamic_extent )

constexpr span ( It first, End last ) ;
(3) (seit C++20)
template < std:: size_t N >
constexpr span ( std:: type_identity_t < element_type > ( & arr ) [ N ] ) noexcept ;
(4) (seit C++20)
template < class U, std:: size_t N >
constexpr span ( std:: array < U, N > & arr ) noexcept ;
(5) (seit C++20)
template < class U, std:: size_t N >
constexpr span ( const std:: array < U, N > & arr ) noexcept ;
(6) (seit C++20)
template < class R >

explicit ( extent ! = std:: dynamic_extent )

constexpr span ( R && r ) ;
(7) (seit C++20)
explicit ( extent ! = std:: dynamic_extent )
constexpr span ( std:: initializer_list < value_type > il ) noexcept ;
(8) (seit C++26)
template < class U, std:: size_t N >

explicit ( extent ! = std:: dynamic_extent && N == std:: dynamic_extent )

constexpr span ( const std:: span < U, N > & source ) noexcept ;
(9) (seit C++20)
constexpr span ( const span & other ) noexcept = default ;
(10) (seit C++20)

Konstruiert einen span .

Inhaltsverzeichnis

Parameter

first - Iterator zum ersten Element der Sequenz
count - Anzahl der Elemente in der Sequenz
last - Iterator hinter dem letzten Element der Sequenz oder ein anderes Sentinel
arr - Array, für das eine Ansicht erstellt werden soll
r - Bereich, für den eine Ansicht erstellt werden soll
source - Ein anderer span , von dem konvertiert werden soll
other - Ein anderer span , von dem kopiert werden soll

Effekte

Überladung data() nach Konstruktion size() nach Konstruktion
( 1 ) nullptr 0
( 2 ) std:: to_address ( first ) count
( 3 ) last - first
( 4 ) std:: data ( arr ) N
( 5 )
( 6 )
( 7 ) ranges:: data ( r ) ranges:: size ( r )
( 8 ) il. begin ( ) il. size ( )
( 9 ) source. data ( ) source. size ( )
( 10 ) other. data ( ) other. size ( )

Einschränkungen und ergänzende Informationen

Größenanforderungen

Wenn extent nicht std:: dynamic_extent ist und die Größe des Quellbereichs sich von extent unterscheidet, kann das span -Objekt nicht konstruiert werden.

Diese Überladungen nehmen nur dann an der Überladungsauflösung teil, wenn das Ergebnis des folgenden Ausdrucks true ist:

1) extent == std:: dynamic_extent || extent == 0
4-6) extent == std:: dynamic_extent || extent == N
9) extent == std:: dynamic_extent || N == std:: dynamic_extent || extent == N


Wenn das Ergebnis des folgenden Ausdrucks false ist, ist das Verhalten undefiniert.

(bis C++26)

Wenn das Ergebnis des folgenden Ausdrucks false ist:

  • Wenn die Implementierung hardened ist, tritt eine contract violation auf. Wenn der Contract-Verletzungs-Handler unter "observe"-Auswertungssemantik zurückkehrt, ist das Verhalten zudem undefiniert.
  • Wenn die Implementierung nicht hardened ist, ist das Verhalten undefiniert.
(seit C++26)
2) extent == std:: dynamic_extent || extent == count
3) extent == std:: dynamic_extent || extent == last - first
7) extent == std:: dynamic_extent || extent == ranges:: size ( r )
8) extent == std:: dynamic_extent || extent == il. size ( )
9) extent == std:: dynamic_extent || extent == source. size ( )

Konvertierungsanforderungen

Wenn element_type sich vom Elementtyp des Quellbereichs unterscheidet und letzterer nicht durch Qualifikationskonvertierung in ersteren umgewandelt werden kann, kann das span -Objekt nicht konstruiert werden.

Diese Überladungen nehmen nur dann an der Überladungsauflösung teil, wenn std:: is_convertible_v < U ( * ) [ ] , element_type ( * ) [ ] > gleich true ist, wobei U wie folgt definiert ist:

4-6) std:: remove_pointer_t < decltype ( std:: data ( arr ) ) >
9) U

Konzeptanforderungen

Wenn irgendein Template-Argument bestimmte Konzept(e) nicht modelliert, kann das span -Objekt nicht konstruiert werden.

Diese Überladungen nehmen nur dann an der Überladungsauflösung teil, wenn das dem angegebenen Template-Parameter entsprechende Template-Argument die entsprechenden Konzepte erfüllt. Wenn es die semantischen Anforderungen eines entsprechenden Konzepts nicht erfüllt, ist das Verhalten undefiniert:

Überladung Template-
parameter
Konzept Bemerkung
( 2 ) It contiguous_iterator
( 3 ) It contiguous_iterator
End sized_sentinel_for<It>
( 7 ) R contiguous_range
sized_range
borrowed_range nur erforderlich, wenn std:: is_const_v < element_type > gleich false ist

Weitere Einschränkungen

2) Wenn [ first , first + count ) kein gültiger Bereich ist, ist das Verhalten undefiniert.
3) Diese Überladung nimmt nur dann an der Überladungsauflösung teil, wenn std:: is_convertible_v < End, std:: size_t > false ist.
Wenn [ first , last ) kein gültiger Bereich ist, ist das Verhalten undefiniert.
7) Diese Überladung nimmt nur dann an der Überladungsauflösung teil, wenn alle folgenden Bedingungen erfüllt sind:
8) Diese Überladung nimmt nur dann an der Überladungsauflösung teil, wenn std:: is_const_v < element_type > gleich true ist.

Exceptions

2) Wirft nichts.
3) Wirft was und wann last - first wirft.
7) Wirft was und wann std :: ranges:: size ( r ) und std :: ranges:: data ( r ) werfen.

Hinweise

Feature-Test Makro Wert Std Funktion
__cpp_lib_span_initializer_list 202311L (C++26) Konstruktion von std::span aus einem std::initializer_list , ( 8 )

Beispiel

#include <array>
#include <iostream>
#include <span>
#include <vector>
void print_span(std::span<const int> s)
{
    for (int n : s)
        std::cout << n << ' ';
    std::cout << '\n';
}
int main()
{
    int c[]{1, 2, 3};
    print_span(c); // Konstruktion aus Array
    std::array a{4, 5, 6};
    print_span(a); // Konstruktion aus std::array
    std::vector v{7, 8, 9};
    print_span(v); // Konstruktion aus std::vector
#if __cpp_lib_span_initializer_list
    print_span({0, 1, 2}); // Konstruktion aus initializer_list
#else
    print_span({{0, 1, 2}}); // dito, eine Problemumgehung
#endif
}

Ausgabe:

1 2 3 
4 5 6
7 8 9
0 1 2

Siehe auch

direkter Zugriff auf den zugrundeliegenden zusammenhängenden Speicher
(öffentliche Elementfunktion)
gibt die Anzahl der Elemente zurück
(öffentliche Elementfunktion)
weist einen span zu
(öffentliche Elementfunktion)
(C++17) (C++20)
gibt die Größe eines Containers oder Arrays zurück
(Funktions-Template)
(C++17)
erhält den Zeiger auf das zugrundeliegende Array
(Funktions-Template)