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