异常安全代码和移动语义

时间:2013-10-25 09:14:42

标签: c++ c++11

我想写容器类。此容器具有insert方法,该方法具有两个特征 - 首先使用复制构造函数将数据从一个容器复制到另一个容器元素。如果复制构造函数抛出异常我只是撤消对容器的所有更改,就像没有任何反应一样。

第二个专业化使用移动构造函数,这就是事情变得复杂的地方。当我将项目从一个容器移动到另一个容器元素时,移动构造函数可以抛出异常。如果发生这种情况 - 当一些元素被移动并且其他元素保留在原始位置时,我的状态非常混乱。如果我试图移回元素 - 我可以得到另一个例外。

是否可以在异常安全方式或异常安全中编写类似的内容,并且移动语义是互斥的?

2 个答案:

答案 0 :(得分:22)

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

有关详细信息,请参阅Scott Meyers' talk at GoingNative 2013

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

答案 1 :(得分:1)

使用构造函数委派是实现此目的的一种方法。如果非委托构造函数(可能是一个没有参数,将您的成员设置为默认值)已完成并且构造函数委托抛出,则标准表示您的本地状态已被删除。这样你就不会泄漏。我今天才在this talk中学到了这一点。

顺便问一下:您实施的STL还没有为您设置什么类型的容器?