为什么要把一个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处理程序,可能是平台特定的,可能会在有趣的地方放置例外,因为它们并不期望它们改变?