5

私たちのチームは、ここhttp://forums.codeguru.com/archive/index.php/t-514404.htmlで説明されているのと同じ問題に遭遇しました。一方、GCCのデフォルトでは、プロトタイプ要素として単一の要素を構築し、新しい要素に対してN回コピー構築しました。some_vec.resize(new_size)N = new_size - some_vec.size()

これはuuidのベクトルであり、default-constructorが新しい各インスタンスをランダムに初期化するため、GCCでは同じuuidのN倍、VCではN個の異なるuuidになります。これは、あるプラットフォームのテストスイートで大混乱を引き起こすのに十分でしたが、別のプラットフォームではそうではなく、見つけるのは面白くありませんでした。

したがって、私の質問は、誰が正しいのかということです。VCまたはGCC?それとも、これは指定されていないC ++の最愛のコーナーの1つですか?TIA、-DD

4

1 に答える 1

6

GCC を-std=c++0xでコンパイルすると、MSVC と同じ結果、つまり N の既定の構造が得られるに違いありません。これは C++11 で変更されました。こちらを参照してください。現在、2 つのオーバーロードがあります。1 つはデフォルトで新しい要素を構築する新しいサイズのみで、もう 1 つは「prototype」パラメータを使用してすべての新しい要素をコピー構築します。

さて、コンパイルするモードに関係なく一貫した結果を得るには、単に使用します

v.resize(new_size, T());

背景情報: 移動できるがコピーできないタイプ ( など) があるため、変更が必要でしたstd::unique_ptr。古い署名ではコピー可能性が要求されました。コピーが必要な操作を使用する場合、標準コンテナー タイプへの最初のテンプレート パラメーターはコピー可能である必要があるだけになりました。

于 2012-07-30T14:20:42.053 に答える