移动构造函数需要标记为noexcept的理解

转自:https://www.jianshu.com/p/7d63991470a8,https://bbs.csdn.net/topics/392084964

1.介绍

 C++primer p474

上面提到在对vector进行push_back重新分配内存空间时,是将旧空间移动到新内存的,但移动过程中有两种情况:一切正常,那么移动成功;抛出异常,vector内的元素会发生改变,导致程序错误。而针对拷贝构造函数也有两种情况:一切正常,那么移动成功;抛出异常,旧元素没有被影响,因为是在新空间上操作的,所以vector内的元素也不会发生改变。

针对移动构造函数可能导致错误的情况的解决办法是:声明它为noexcept的,一旦抛出了异常,那么编译器会调用std::terminate()函数中断程序执行。直接结束程序,保证了安全性。

2.例子

https://blog.csdn.net/craftsman1970/article/details/81104760

将这个类的移动构造函数被声明为noexcept,但仍然throw了异常,结果:

 程序会直接退出,不会执行后续的代码了。

原文地址:https://www.cnblogs.com/BlueBlueSea/p/14474929.html