パスワードを忘れた? アカウント作成
469409 journal

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

ふむ。古めのコンパイラも使うことが予想される場合は止めておいた方がいいか。

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
typodupeerror

コンピュータは旧約聖書の神に似ている、規則は多く、慈悲は無い -- Joseph Campbell

読み込み中...