为什么要把一个exception作为引用到const?
我已经多次听说过,最好能把一个exception作为const引用而不是引用来引用。 为什么是
try { // stuff } catch (const std::exception& e) { // stuff }
比…更好
try { // stuff } catch (std::exception& e) { // stuff }
你需要:
- 一个引用,所以你可以多态访问exception
- 一个const来提高性能,并告诉编译器你不会修改对象
后者并不像前者那么重要,但是抛弃const的唯一真正原因就是表明你想对exception做出改变(通常只有当你想把它添加到更高级别的情况下重新抛出时才有用) 。
基本上没有任何理由。
exception对象存在于自己的内存空间中,所以你不必担心捕获在临时expression式中创build的exception。
你所做的只是保证你不会修改exception对象,但是由于exception对象应该有一个不可变的接口‡ ,这里没有任何实际的用处。
但是,当你阅读时,它可能会使你感到温暖和舒适 – 这就是我的!
†他们有自己的,特殊的线程局部堆栈。
‡ 免责声明: Boost.Exception打破这个时髦的东西,并添加exception详细信息,后build设。 但这是骇客!
它告诉编译器,你将不会调用任何修改exception的函数,这可能有助于优化代码。 可能没有什么区别,但是做这个的成本也是非常小的。
出于同样的原因你使用一个const。
你要修改exception吗? 如果不是的话,也可能是const。 同样的原因,你应该在其他地方使用const(我说应该是因为它没有真正在表面上有太大的区别,可以帮助编译器,也帮助编码人员正确地使用你的代码,而不是做他们不应该做的事情)
exception处理程序,可能是平台特定的,可能会在有趣的地方放置例外,因为它们并不期望它们改变?