移动构造函数需要标记为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了异常,结果:
程序会直接退出,不会执行后续的代码了。