在和同事解释对象的移动操作时,我基本上说移动操作不应该在容器中抛出异常,因为如果移动操作失败,那么就没有办法可靠地恢复原始对象。再想一想,我想知道这是否不正确,如果移动操作确实抛出,它可以将原始对象恢复到原始状态。
这样做的原因是,如果一个对象可以抛出,那么它不会因为将包含的对象从旧地址复制或移动到新地址而抛出,而是在资源获取失败时抛出。所以所有原始信息应该仍然存在。如果是这种情况,那么编译器是否应该无法逆转它为重构原始对象所做的操作?
一个操作可能是一种方式,比如移动一个整数,但在这种情况下它可能只是终止应用程序,也许如果开发人员想避免这种方式操作可以使用交换方法来代替。
这只能在默认的移动运算符上实现,就像有任何额外的逻辑一样,编译器可能很难进行反向部分转换。
我是否过于简单化了事情?有没有我错过的东西可以让容器在没有非抛出移动构造函数/操作符的情况下移动对象?