どこかのだれかへ

職業ゲームプログラマ。気になったニュースのピックアップや開発日記などを書いています。

Stack<T>の複製が罠な件

コピーコンストラクタで複製したつもりが、順番が入れ替わっている罠があり、今日引っかかりました。

Stack<int> stack = new Stack<int>();
stack.Push( 1 );
stack.Push( 2 );
stack.Push( 3 );
// 3, 2, 1

Stack<int> clone = new Stack<int>( stack );
// 1, 2, 3

StackはStack::Pushを呼ぶとコンテナの前方に追加されます。そんな仕様なので、気を遣ってくれたのか、Stack::Stack( IEnumerable )を呼ぶを順番前後入れ替えてくれます。

とりあえずStack::Resrveしてから複製するようにしてましたが、この記事を書いてたらそんな分かりにくいコード書くくらいならStack使わない方がいいんじゃないとか思ってきました。

すごい紛らわしいので、せめて普通のコピーコンストラクタも欲しかったです……