最終更新日時: 2024年06月11日 22時45分38秒 (JST)
Akira Takahashi が更新

履歴 編集

variable
<span>

# std::dynamic_extent(C++20)

    namespace std {
      inline constexpr size_t dynamic_extent = numeric_limits<size_t>::max();
    }

## 概要

`dynamic_extent`は、動的な要素数をもつことを`std::span`や`std::mdspan`に指示するための定数である。

### std::span

以下のような状況で、`span`クラスは動的な要素数をもつようになる：

- デフォルトテンプレート引数を使用 (デフォルトで`dynamic_extent`が使用される)
- 動的な長さをもつ範囲を参照する (`vector`や、ポインタと要素数の組など)
- 参照範囲の変更を、動的な値で指定する (`s.first<N>()`は静的な要素数、`s.first(n)`は動的な要素数をもつ`span`オブジェクトを作成する)

## 例

    #include <span>
    #include <cassert>
    #include <vector>

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

        static_assert(decltype(s)::extent == std::dynamic_extent);
        assert(s.size() == v.size());
      }
      {
        int ar[] = {1, 2, 3, 4, 5};
        std::span s{ar};

        static_assert(decltype(s)::extent == 5);

        // 先頭3要素を参照する。
        // 1. 動的な要素数を指定する
        std::span r1 = s.first(3);
        static_assert(decltype(r1)::extent == std::dynamic_extent);
        assert(r1.size() == 3);

        // 2. 静的な要素数を指定する
        std::span r2 = s.first<3>();
        static_assert(decltype(r2)::extent == 3);
        assert(r2.size() == 3);
      }
    }

### 出力

## バージョン

### 言語

- C++20

### 処理系

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

## 関連項目

- C++20 `span`
- C++23 `mdspan`