将对象移动到 std::vector 时的异常保证

Exception guarantees when moving object into std::vector

如果在将对象移入 std::vector 时内存分配失败,并且抛出 bad_alloc,std::vector 是否保证移出的对象 unaltered/still 有效?

例如:

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? */

这在 [container.requirements.general]/11.2

中有介绍

if an exception is thrown by a push_­back(), push_­front(), emplace_­back(), or emplace_­front() function, that function has no effects.

因此,如果发生异常,您将不会从对象中移动。

这仅涵盖向量抛出的情况。我们需要查看 [vector.modifiers]/1 以了解如果移动构造函数本身抛出会发生什么:

If an exception is thrown while inserting a single element at the end and T is Cpp17CopyInsertable or is_­nothrow_­move_­constructible_­v<T> is true, there are no effects. Otherwise, if an exception is thrown by the move constructor of a non-Cpp17CopyInsertable T, the effects are unspecified.

强调我的

在那种情况下,行为是未指定的。


在你的情况下 std::string 有一个 noexcpet 移动构造函数,所以如果抛出异常你将有一个有效的对象。