- cpp20[meta cpp]
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
式で要素数を必須とする強い理由がないため、推論できるようになった。