最終更新日時: 2026年01月31日 13時25分25秒 (JST)
Akira Takahashi が更新

履歴 編集

function template
<iterator>

# std::ssize(C++20)

    namespace std {
      template <class C>
      constexpr auto
        ssize(const C& c)
          -> common_type_t<ptrdiff_t, make_signed_t<decltype(c.size())>>;  // (1) C++20
      template <class C>
      constexpr auto
        ssize(const C& c)
          noexcept(noexcept(c.size()))
          -> common_type_t<ptrdiff_t, make_signed_t<decltype(c.size())>>;  // (1) C++26

      template <class T, ptrdiff_t N>
      constexpr ptrdiff_t
        ssize(const T (&array)[N]) noexcept;                               // (2) C++20
    }

## 概要

コンテナの要素数を、符号付き整数型で取得する。

- (1) : コンテナの要素数を取得する
- (2) : 生配列の要素数を取得する

この関数の戻り値は、標準コンテナも含めて基本的には`std::ptrdiff_t`型が返る。ただし、自作コンテナの`size()`メンバ関数が`std::size_t`と異なる幅の型を返す場合は、それに対応する符号付き整数型が返る。

## 戻り値

- (1) : `return c.size();`
- (2) : `return N;`

## 例

    #include <cassert>
    #include <vector>
    #include <iterator>

    int main()
    {
      std::vector<int> v = {1, 2, 3};
      int ar[] = {1, 2, 3};

      // コンテナの要素数を取得。
      std::ptrdiff_t n1 = std::ssize(v);
      assert(n1 == 3);

      // 生配列の要素数を取得
      std::ptrdiff_t n2 = std::ssize(ar);
      assert(n2 == 3);
    }

### 出力

## バージョン

### 言語

- C++20

### 処理系

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

## 関連項目

- C++23 (符号付き)`size_t`リテラルのためのサフィックス
- `std::cmp_less()`

## 参照

- P1227: Signed `ssize()` functions, unsigned `size()` functions (Revision 2)
- P3016R6 Resolve inconsistencies in `begin`/`end` for `valarray` and `braced-initializer-list`