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

履歴 編集

function
<span>

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

    template <std::size_t Count>
    constexpr span<element_type, Count>
       first() const;                             // (1)

    constexpr span<element_type, dynamic_extent>
      first(size_type count) const;               // (2)

## 概要

先頭N個の要素を参照する`span`オブジェクトを取得する。

- (1) : テンプレートパラメータ`Count`で指定された要素数だけ先頭から取り出す
- (2) : パラメータ`count`で指定された要素数だけ先頭から取り出す

## 適格要件

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

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

- (1) : `Count <= size()`が`true`であること
- (2) : `count <= size()`が`true`であること

## 戻り値

(1)であれば`Count`を`N`、(2)であれば`count`を`N`として、以下と等価：

    return {data(), N};

## 計算量

定数時間

## 例

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

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

      std::span s{v};

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

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

### 出力

    1
    2
    3

    1
    2
    3

## バージョン

### 言語

- 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