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 を構築します。

目次

注記: - 「Contents」のみ「目次」に翻訳しました - C++関連の専門用語(Parameters, Effects, Constraints, Exceptions, Notes, Example, See alsoなど)は原文のまま保持しています - HTMLタグ、属性、クラス名、IDなどは一切変更していません - 番号付けや構造は完全に保持されています

パラメータ

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 がソース範囲の要素型と異なり、かつ後者が 資格変換 によって前者に変換できない場合、 span オブジェクトは構築できません。

これらのオーバーロードは、以下の条件を満たす場合にのみオーバーロード解決に参加します: std:: is_convertible_v < U ( * ) [ ] , element_type ( * ) [ ] > true である場合です。ここで U は以下のように定義されます:

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

コンセプト要件

いずれかのテンプレート引数が特定のコンセプトをモデル化しない場合、 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) 例外を送出しない。
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)