最終更新日時: 2025年07月10日 10時26分30秒 (JST)
Koichi Murase が更新

履歴 編集

# new式での配列要素数の推論 [P1009R2](C++20)

このページはC++20に採用された言語機能の変更を解説しています。

のちのC++規格でさらに変更される場合があるため関連項目を参照してください。

## 概要

C++20では、`new`式で配列の要素数を推論できる。

    // C++20
    double a[3] {1,2,3};               // OK
    double a[] {1,2,3};                // OK
    double* p = new double[3]{1,2,3};  // OK
    double* p = new double[]{1,2,3};   // OK (P1009R2非対応の環境ではエラー)
    double* p = new double[](1,2,3);   // OK (丸カッコでの集成体初期化:C++20)
    char*   p = new char[]{"hello"};   // OK (P1009R2非対応の環境ではエラー)

要素数が推論できない場合、エラーとなる。

    // C++20
    double a[];               // エラー
    double* p = new double[]; // エラー

この変更(P1009R2)は過去すべてのC++規格に遡って適用された。そのため、P1009R2に対応した環境では、言語バージョンにかかわらず使用できる。 また、clangは以前から独自にサポートしていた。

## 例

    #include <iostream>

    int main()
    {
      int* a = new int[]{1, 2, 3};
      for (int i = 0; i < 3; ++i) {
        std::cout << a[i] << '\n';
      }
      delete[] a;
    }

### 出力

    1
    2
    3

## この機能が必要になった背景・経緯

`new`式での配列要素数は文法上必須となっていて省略することができなかったが、通常の配列の宣言では要素数を省略できるので一貫性がなかった。

    // C++17
    double a[3] {1,2,3}               // OK
    double a[] {1,2,3}                // OK
    double* p = new double[3]{1,2,3}  // OK
    double* p = new double[]{1,2,3}   // エラー

`new`式で要素数を必須とする強い理由がないため、推論できるようになった。

## 関連項目

- 丸カッコの値リストからの集成体初期化を許可

## 参照

- P1009R2 Array size deduction in new-expressions