将对象移动到 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
移动构造函数,所以如果抛出异常你将有一个有效的对象。
如果在将对象移入 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()
, oremplace_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 oris_nothrow_move_constructible_v<T>
istrue
, there are no effects. Otherwise, if an exception is thrown by the move constructor of a non-Cpp17CopyInsertableT
, the effects are unspecified.
强调我的
在那种情况下,行为是未指定的。
在你的情况下 std::string
有一个 noexcpet
移动构造函数,所以如果抛出异常你将有一个有效的对象。