Andrzejのmoveコンストラクターの記事へのコメントで、moved fromオブジェクトは、前提条件を持たない任意のメンバー関数を呼び出すことができると投稿しました。ベクトルが空でないという前提条件があるためstd::vector::front
、moved-fromでは呼び出せない関数として例を示しました。std::vector
、、およびを移動元で呼び出すことができる(ただし呼び出すべきではない)関数として、前提条件がないため、例を示しましたstd::vector::empty
。std::vector::push_back
std::vector::reserve
std::vector
しかし、それは私に考えさせられました。std::vector::push_back
ホストシステムで利用可能な十分な連続メモリがある必要があります。これは、std::vector
オブジェクトが実行されているシステムに関するものであるため、オブジェクトに対する要件ではありませんが、それでも私には前提条件のようです。
オブジェクトを有効であるが指定されていない状態のままにする移動コンストラクターのコンテキストは何ですか?それは、メモリ不足の可能性のある状況に適用されstd::vector::push_back
ますか?特に、std::vector::push_back
移動前に機能していたとしたら、移動後に機能することが保証されていますか(他のプロセスがメモリを使い果たすなどの問題を無視して)?
参考:§17.6.3.1
Table 20 — MoveConstructible requirements [moveconstructible]
Expression Post-condition
T u = rv; u is equivalent to the value of rv before the construction
T(rv) T(rv) is equivalent to the value of rv before the construction
rv’s state is unspecified [ Note:rv must still meet the requirements of the library compo-
nent that is using it. The operations listed in those requirements must work as specified
whether rv has been moved from or not. — end note ]