【发布时间】:2018-11-08 10:37:24
【问题描述】:
在和同事解释对象的移动操作时,我基本上说移动操作不应该在容器中抛出异常,因为如果移动操作失败,那么就没有办法可靠地恢复原始对象。再想一想,我想知道这是否不正确,如果移动操作确实抛出,它可以将原始对象恢复到原始状态。
原因是,如果一个对象可以抛出,那么它不会因为将包含的对象从旧地址复制或移动到新地址而抛出,而是如果无法获取资源则抛出。所以所有的原始信息应该仍然存在。如果是这种情况,那么编译器是否应该无法反转它为重构原始对象所做的操作?
一个操作可能是一种方式,比如移动一个整数,但在这种情况下,它可能只是终止应用程序,如果开发人员想避免这种方式操作,也许可以使用交换方法。
这只能在默认的移动运算符上实现,如果有任何额外的逻辑,编译器可能很难进行反向部分转换。
我是否过于简单化了?是否有什么我错过的东西可以让容器在没有非抛出移动构造函数/操作符的情况下移动对象?
【问题讨论】:
-
当 move ctor 可以抛出时,vector 不会退回到副本上吗?
-
@JVApen,是的。我想知道是否可以使用会抛出的移动构造函数。
-
注意:不仅移动构造函数必须不抛出标准容器移动,而且必须声明
noexcept -
vector的问题是还原 已完成 动作。你需要移动六,移动三,第四会抛出异常。即使您要求不更改第四个,您仍然没有可靠的方法来恢复前三个。 -
是的@ArneVogel,我提到了here。
标签: c++ c++11 stl c++14 stdmove