18

我想写容器类。这个容器有两个特化的插入方法——首先使用复制构造函数将数据从一个容器复制到另一个容器元素。如果复制构造函数抛出异常,我只是撤消对容器的所有更改,就像什么都没发生一样。

第二个专业化使用移动构造函数,这就是事情变得复杂的地方。当我逐个元素地将项目从一个容器移动到另一个容器时,移动构造函数可能会引发异常。如果发生这种情况 - 当某些元素被移动而其他元素留在原来的位置时,我的状态真的很混乱。如果我尝试将元素移回 - 我会遇到另一个异常。

是否可以以异常安全的方式编写这样的东西,或者异常安全和移动语义是互斥的?

4

2 回答 2

23

在编写异常敏感代码时使用std::move_if_noexcept,但在编译时安全时仍希望使用移动语义。

有关详细信息,请参阅Scott Meyers 在 GoingNative 2013上的演讲。

PS:哦,是的,请记住,如果你的东西不是可复制构造的,那么无论你的移动构造函数是否抛出/不抛出,你都会移动它。

于 2013-10-25T09:23:26.447 回答
1

使用构造函数委托是一种方法。如果非委托构造函数(可能是一个不带参数的构造函数,将您的成员设置为默认值)已经完成并且委托构造函数抛出,则标准表示您的本地状态已被删除。这样就不会泄露了。我今天才在这次演讲中了解到这一点。

顺便说一句:你正在实现什么类型的容器,而 STL 还没有为你设置好?

于 2013-10-25T09:27:22.710 回答