C++11新特性(51)- 移动构造函数通常应该是noexcept

不会抛出异常的移动构造函数

拷贝构造函数通常伴随着内存分配操作,因此很可能会抛出异常;移动构造函数一般是移动内存的所有权,所以一般不会抛出异常。

C++11中新引入了一个noexcept关键字,用来向程序员,编译器来表明这种情况。

 

noexcept函数

对于永远不会抛出异常的函数,可以声明为noexcept的。这一方面有助于程序员推断程序逻辑,另一方面编译器可以更好地优化代码。

为了说明这个效果我们将Tracer类稍作修改。

分别在拷贝构造函数和移动构造函数(noexcept)中实际上抛出异常看看程序的反应。

没有声明noexcept的情况

首先是没有声明为noexcept的拷贝构造函数。

try处理中调用了拷贝构造函数,输出结果如下:

异常被正常捕捉。

声明了noexcept函数的情况

try处理中调用了声明为noexcept的移动构造函数,输出结果如下:

同样的try/catch构造已经不能捕捉移动构造函数抛出的异常从而导致程序终止。这说明noexcept影响了编译器生成的代码。

作者观点

生成高效代码的另一个侧面就是功能的缺失,高级的东西有时候可能是双刃剑,要理解了才能用好。

觉得本文有帮助?请分享给更多人。

阅读更多更新文章,请扫描下面二维码,关注微信公众号【面向对象思考】

猜你喜欢

转载自blog.csdn.net/craftsman1970/article/details/81104760