2017-07-26 13 views

答えて

5

移動コンストラクタが存在し、noexceptである場合、それが使用されます。それ以外の場合は、コピーコンストラクタが使用されます。

スローする可能性がある移動コンストラクタを使用すると、一部のオブジェクトが新しいストレージに移動され、移動するオブジェクトの残りの部分が例外になることがあるため、望ましくありません。

cppreference.comサイトでは、オブジェクトがコピー可能ではなく、noexcept以外の移動コンストラクタを持つ場合、例外がスローされた場合、その移動コンストラクタを「未指定の動作」で使用します。私は要素がベクトルから失われる可能性があることを意味します。

+0

[cppreference.com](http://en.cppreference.com/w/cpp/container/vector/push_back)のドキュメントは、あなたの言っていることに全く同意しません。 Tの移動コンストラクタがnoexceptでなく、Tが* thisへのCopyInsertableでない場合、vectorはスローする移動コンストラクタを使用します。それがスローされた場合、保証は放棄され、エフェクトは指定されません。 –

+0

@RSahuそのドキュメントは、挿入されている要素を参照しています。この質問は既にベクトルにある要素の振る舞いに関するものです。例えば。 'v.reserve(v.capacity()+ 1);' –

+0

[std :: vector :: reserve](http://en.cppreference.com/w/cpp/container/vector/reserve)は同じものを使用します。文言。 –

関連する問題