Namespaces
Variants

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

From cppreference.net
constexpr span ( ) noexcept ;
(1) (C++20 이후)
template < class It >

explicit ( extent ! = std:: dynamic_extent )

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

explicit ( extent ! = std:: dynamic_extent )

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

explicit ( extent ! = std:: dynamic_extent )

constexpr span ( R && r ) ;
(7) (C++20 이후)
explicit ( extent ! = std:: dynamic_extent )
constexpr span ( std:: initializer_list < value_type > il ) noexcept ;
(8) (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) (C++20 이후)
constexpr span ( const span & other ) noexcept = default ;
(10) (C++20부터)

span 을 생성합니다.

목차

매개변수

first - 시퀀스의 첫 번째 요소에 대한 반복자
count - 시퀀스의 요소 개수
last - 시퀀스의 마지막 요소 다음 반복자 또는 다른 센티널
arr - 뷰를 생성할 배열
r - 뷰를 생성할 범위
source - 변환할 다른 span
other - 복사할 다른 span

효과

오버로드 data() 생성 후 size() 생성 후
( 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 ( )

제약 조건 및 보충 정보

크기 요구사항

만약 extent std:: dynamic_extent 가 아니고 소스 범위의 크기가 extent 와 다르다면, span 객체는 생성될 수 없습니다.

다음 오버로드는 다음 표현식의 결과가 true 인 경우에만 오버로드 해결에 참여합니다:

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


다음 표현식의 결과가 false 인 경우, 동작은 정의되지 않습니다.

(C++26까지)

다음 표현식의 결과가 false 인 경우:

  • 구현이 hardened 된 경우, contract violation 이 발생합니다. 또한 계약 위반 핸들러가 "observe" 평가 의미론 하에 반환하는 경우, 동작은 정의되지 않습니다.
  • 구현이 hardened 되지 않은 경우, 동작은 정의되지 않습니다.
(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 ( )

변환 요구사항

만약 element_type 이 소스 범위의 요소 타입과 다르고, 후자가 qualification conversion 에 의해 전자로 변환될 수 없는 경우, span 객체는 생성될 수 없습니다.

이러한 오버로드는 다음 조건에서만 오버로드 해결에 참여합니다: std:: is_convertible_v < U ( * ) [ ] , element_type ( * ) [ ] > true 인 경우이며, 여기서 U 는 다음과 같이 정의됩니다:

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

개념 요구사항

템플릿 인수가 특정 개념(concept)을 모델링하지 않을 경우, span 객체를 생성할 수 없습니다.

이러한 오버로드는 지정된 템플릿 매개변수에 해당하는 템플릿 인자가 해당 개념(들)을 만족하는 경우에만 오버로드 해결에 참여합니다. 해당하는 개념들의 의미론적 요구사항을 충족하지 않을 경우, 동작은 정의되지 않습니다:

오버로드 템플릿
매개변수
컨셉 비고
( 2 ) It contiguous_iterator
( 3 ) It contiguous_iterator
End sized_sentinel_for<It>
( 7 ) R contiguous_range
sized_range
borrowed_range 다음 경우에만 필요함 std:: is_const_v < element_type > false 인 경우

기타 제약 조건

2) 만약 [ first , first + count ) 유효한 범위 가 아니면, 동작은 정의되지 않습니다.
3) 이 오버로드는 다음 조건이 std:: is_convertible_v < End, std:: size_t > 일 때에만 오버로드 해결에 참여합니다. false .
만약 [ first , last ) 가 유효한 범위가 아닌 경우, 동작은 정의되지 않습니다.
7) 이 오버로드는 다음의 모든 조건이 만족될 때에만 오버로드 해결에 참여합니다:
8) 이 오버로드는 다음 조건에서만 오버로드 해결에 참여합니다: std:: is_const_v < element_type > true 인 경우.

예외

2) 아무것도 throw하지 않습니다.
3) 무엇을 언제 던지는지 last - first 가 던질 때.
7) 무엇을 언제 던지는지 std :: ranges:: size ( r ) std :: ranges:: data ( r ) 가 던지는 예외.

참고 사항

기능 테스트 매크로 표준 기능
__cpp_lib_span_initializer_list 202311L (C++26) std::span 생성 std::initializer_list 에서, ( 8 )

예제

#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); // 배열로부터 생성
    std::array a{4, 5, 6};
    print_span(a); // std::array로부터 생성
    std::vector v{7, 8, 9};
    print_span(v); // std::vector로부터 생성
#if __cpp_lib_span_initializer_list
    print_span({0, 1, 2}); // initializer_list로부터 생성
#else
    print_span({{0, 1, 2}}); // 동일하게, 우회 방법
#endif
}

출력:

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

참고 항목

기본 연속 저장소에 대한 직접 접근
(public member function)
요소의 개수를 반환
(public member function)
span 을 할당
(public member function)
(C++17) (C++20)
컨테이너나 배열의 크기를 반환
(function template)
(C++17)
기본 배열에 대한 포인터를 얻음
(function template)