1

現時点での移動セマンティクスはさておき、標準では、新しい配置とコピー コンストラクターを使用するために、ベクトルの再割り当てと vector::push_back が必要ですか? もしそうなら、標準のどこにそう言っていますか?

4

2 に答える 2

4

はいといいえ。ベクターは、他のすべてのコンテナーと同様に、allocator_traits<allocator_type>::constructand allocator_traits<allocator_type>::destroy(§23.2.1/3) を使用し、アロケーター (§23.2.1/7) を使用してすべてのメモリを取得する必要があります。カスタム アロケーターを提供すると、ほとんど何でも実行できます。デフォルトのアロケータは、呼び出し::operator new (§20.6.9.1/6) と配置 new (§20.6.9.1/12) を使用する必要があります。

于 2013-02-18T16:18:08.563 に答える
0

C ++11§23.3.6.3、約std::vector::reserve

「非型のmoveコンストラクタ以外で例外がスローされた場合、CopyInsertable影響はありません。」

これは、CopyInsertableアイテム以外のタイプのバッファー再割り当ての場合、実装は、可能であれば、タイプのコピーコンストラクターを使用せずに、アイテムを古いバッファーから新しいバッファーに自由に移動できることを意味します。

移動コンストラクターからの例外の影響は、上記の段落で指定されていません。これは、§23.3.6.5で明示されていinsertますpush_back。「非の移動コンストラクターによって例外がスローされた場合CopyInsertable T、影響は指定されていません。 。」

新しい配置の使用は、既存のストレージにオブジェクトを構築するための言語の唯一の機能であるため、暗示されます。James Kanzeが彼の回答で述べているように、アロケータの要件を介して、また§23.2.1/ 2の要件によって、アロケータのconstruct方法を使用することも明示的に要求されています。

于 2013-02-18T16:44:02.127 に答える