Yoh2の日記: [C/C++規格: 7] 配列を()で初期化
日記 by
Yoh2
某掲示板で話題に上って初めて知った。
今までダメだと思っていたけど、配列をnewする時、空の初期化子"()"を付けて初期化できるみたい。
つまりこんな感じに書けるということ。
int *p = new int[5]();
JIS X 3014:2003を読み直してみると、確かに配列に初期化子を付けてはいけないとはどこにも書いていない。
ただ、引数のある初期化子の場合、引数をnewする型に変換できたり、コンストラクタが定義されたりしていなければならいため、結果的に配列に引数付きの初期化子が使えない、というだけ。
そして引数なしの初期化子は値初期化される、とある。そして値初期化は配列に対してもその挙動が定義されているため初期化できる、という寸法。
今までずっと
int *p = new int[5];
std::fill_n(p, 5, 0);
と書いていたけど、これからはちょっと楽できそう。……手持ちのコンパイラできちんと動けば。
というわけで確認。
問題なし:
VC++2008
g++-4.1.2
コンパイルは通るが値初期化されず:
Open Watcom C++ 1.5
コンパイルが通らず:
Borland C++ 5.1.1
Digital Mars C++ 8.42n
ふむ。古めのコンパイラも使うことが予想される場合は止めておいた方がいいか。
[C/C++規格: 7] 配列を()で初期化 More ログイン