最終更新日時: 2026年02月26日 13時20分38秒 (JST)
Akira Takahashi が更新

履歴 編集

function
<span>

# std::span::subspan(C++20)

    template <std::size_t Offset, std::size_t Count = dynamic_extent>
    constexpr span<element_type, see below>
      subspan() const;                                                   // (1)

    constexpr span<element_type, dynamic_extent>
      subspan(size_type offset, size_type count = dynamic_extent) const; // (2)

## 概要

任意の位置からN個の要素を参照する`span`オブジェクトを取得する。

- (1) : テンプレートパラメータで指定された任意の開始位置`Offset`と要素数`Count`にしたがって要素を取り出す
- (2) : パラメータで指定された任意の開始位置`offset`と要素数`count`にしたがって要素を取り出す

## 適格要件

- (1) : `Offset <= Extent && (Count == dynamic_extent || Count <= Extent - Offset)`が`true`であること

## 堅牢化された事前条件

(1)であれば`Offset`を`i`、`Count`を`N`とし、(2)であれば`offset`を`i`、`count`を`N`として、

- `i <= size() && (N == dynamic_extent || N <= size() - i)`が`true`であること

## 戻り値

- (1) : 以下と等価：

      return span<ElementType, see below>(
          data() + Offset, Count != dynamic_extent ? Count : size() - Offset);

  - ここで戻り値の型の第2テンプレート引数は以下になる：

      Count != dynamic_extent   ? Count :
      (Extent != dynamic_extent ? Extent - Offset :
      dynamic_extent)

- (2) : 以下と等価：

      return {data() + offset, count == dynamic_extent ? size() - offset : count};

## 計算量

定数時間

## 例

    #include <iostream>
    #include <span>
    #include <vector>

    int main()
    {
      std::vector<int> v = {1, 2, 3, 4, 5};
      std::span<int> s = std::span{v};

      // (1) : テンプレート引数として開始位置と要素数を指定して、要素を取得する。
      // テンプレート内でこのオーバーロードを使用する場合、s.template subspan<2, 3>(); のように、
      // template限定子の指定が必要になることに注意
      std::span<int, 3> static_span = s.subspan<2, 3>();
      for (int x : static_span) {
        std::cout << x << std::endl;
      }
      std::cout << std::endl;

      // (2) : 引数として開始位置と要素数を指定して、要素を取得する
      std::span<int, std::dynamic_extent> dynamic_span = s.subspan(2, 3);
      for (int x : dynamic_span) {
        std::cout << x << std::endl;
      }
    }

### 出力

    3
    4
    5

    3
    4
    5

## バージョン

### 言語

- C++20

### 処理系

- Clang: 9.0 ✅
- GCC: ??
- Visual C++: ??

## 参照

- P1872R0 `span` should have `size_type`, not `index_type`
- LWG Issue 3103. Errors in taking subview of `span` should be ill-formed where possible
- P3471R4 Standard library hardening
- P3878R1 Standard library hardening should not use the 'observe' semantic