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:

Post a Comment

You can use some HTML elements, such as <b>, <i>, <a>, also, some characters need to be entity referenced such as <, > and & Your comment may need to be confirmed by blog author. Your comment will be published under GFDL 1.3 or later license with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.