1

オブジェクトを std::vector に移動しているときにメモリ割り当てが失敗し、bad_alloc がスローされた場合、std::vector は、移動されたオブジェクトが変更されていない/まだ有効であることを保証しますか?

例えば:

std::string str = "Hello, World!";
std::vector<std::string> vec;

vec.emplace_back(std::move(str));
/* Is str still valid and unaltered if the previous line throws? */
4

1 に答える 1

7

これは[container.requirements.general]/11.2でカバーされています

push_­back()push_­front()emplace_­back()、または関数によって例外がスローされた場合emplace_­front()、その関数は何の効果もありません。

したがって、例外が発生した場合にオブジェクトから移動することはありません。

これは、ベクトルがスローされた場合にのみカバーされます。[vector.modifiers]/1を調べて、ムーブ コンストラクター自体がスローした場合に何が起こるかを確認する必要があります。

最後に単一の要素を挿入しているときに例外がスローされ、Cpp17CopyInsertableまたはTisである場合、影響はありません。それ以外の場合、非Cpp17CopyInsertableの移動コンストラクターによって例外がスローされた場合、その効果は規定されていません。is_­nothrow_­move_­constructible_­v<T>true T

強調鉱山

その場合、動作は規定されていません。


あなたの場合std::stringnoexcpet移動コンストラクターがあるため、例外がスローされた場合に有効なオブジェクトが得られます。

于 2019-08-09T18:35:02.333 に答える