現時点での移動セマンティクスはさておき、標準では、新しい配置とコピー コンストラクターを使用するために、ベクトルの再割り当てと vector::push_back が必要ですか? もしそうなら、標準のどこにそう言っていますか?
2 に答える
はいといいえ。ベクターは、他のすべてのコンテナーと同様に、allocator_traits<allocator_type>::construct
and
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) を使用する必要があります。
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
方法を使用することも明示的に要求されています。