异常安全代码和移动语义

Evg*_*zin 17 c++ c++11

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

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

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

ice*_*nix 22

在编写异常敏感代码时使用std :: move_if_noexcept,但仍然希望在编译时安全的情况下使用移动语义.

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

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

  • 用IMO定义它的一个可怕的选择...你可以制作你自己的版本(没有`&& std :: is_copy_constructible <T> :: value`),这将导致编译时错误. (2认同)