不会抛出异常的移动构造函数
拷贝构造函数通常伴随着内存分配操作,因此很可能会抛出异常;移动构造函数一般是移动内存的所有权,所以一般不会抛出异常。
C++11中新引入了一个noexcept关键字,用来向程序员,编译器来表明这种情况。
noexcept函数
对于永远不会抛出异常的函数,可以声明为noexcept的。这一方面有助于程序员推断程序逻辑,另一方面编译器可以更好地优化代码。
为了说明这个效果我们将Tracer类稍作修改。
分别在拷贝构造函数和移动构造函数(noexcept)中实际上抛出异常看看程序的反应。
没有声明noexcept的情况
首先是没有声明为noexcept的拷贝构造函数。
try处理中调用了拷贝构造函数,输出结果如下:
异常被正常捕捉。
声明了noexcept函数的情况
try处理中调用了声明为noexcept的移动构造函数,输出结果如下:
同样的try/catch构造已经不能捕捉移动构造函数抛出的异常从而导致程序终止。这说明noexcept影响了编译器生成的代码。
作者观点
生成高效代码的另一个侧面就是功能的缺失,高级的东西有时候可能是双刃剑,要理解了才能用好。
觉得本文有帮助?请分享给更多人。
阅读更多更新文章,请扫描下面二维码,关注微信公众号【面向对象思考】