概要
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 (C++17ではエラー)
double* p = new double[](1,2,3); // OK (丸カッコでの集成体初期化:C++20)
char* p = new char[]{"hello"}; // OK (C++17ではエラー)
要素数が推論できない場合、エラーとなる。
// C++20
double a[]; // エラー
double* p = new double[]; // エラー
例
#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
式で要素数を必須とする強い理由がないため、推論できるようになった。
なお、clangは以前からnew
式での配列要素数を推論できていたが、clang独自の拡張である。