2011-05-24

initializer_listのコピー

Bug 49122 – [C++0x] initializer_list is broken

なかなか興味深い。

initializer_listには、明示的なコンストラクターがない。initializer_listのコピーは、内部的な要素をコピーしないと明言されている。

initizalizer_listの実装というのは、ポインターが想定されている。例えば以下のようなコードに対しては、

std::initializer_list<int> list = { 1, 2, 3 } ;

以下のような実装になる。

int a[3] = { 1, 2, 3 } ;
// 実装依存の方法で、配列aの要素へのポインターを保持するinitializer_listを生成

とすれば、以下のコードが動かないのも、当然と言える。

std::initializer_list<int> f()
{
    std::initializer_list<int> list = { 1, 2, 3 } ;
    return list ;
}

何故ならば、関数が返したinitializer_listの内部的なポインターは、もはや妥当なメモリを指し示していないからだ。

というわけで、関数の戻り値の型として使いたければ、std::arrayやstd::vectorなどのコンテナーを使うべきだろう。

No comments: