我听过和读过很多次,说以 reference-to-const 的方式捕获异常比以 reference 的方式捕获异常要好。为什么是
try {
// stuff
} catch (const std::exception& e) {
// stuff
}
比..:
try {
// stuff
} catch (std::exception& e) {
// stuff
}
你需要:
后者不是 多少 和前者一样重要,但放弃const的唯一真正原因是为了表明你想对异常进行修改(通常只有当你想把它添加上下文后重新扔到更高的级别时才有用)。
基本上没有任何理由。
异常对象活在自己的内存空间里† 所以你不必担心捕获临时表达式中创建的异常。
你所做的只是承诺不会修改异常对象,但由于异常对象应该有一个不可变的接口------。‡,这里真的没有什么实用的东西。
然而,当你读到它时,它可能会让你感到温暖和舒适--对我来说就是这样。
† 它们有自己的、特殊的、线程本地的栈。 ‡ 声明。 Boost.Exception打破了这一点,以便做一些有趣的事情,并在构造后添加异常细节。但这是黑客行为!它告诉编译器,你不会调用任何修改异常的函数,这可能有助于优化异常。
它告诉编译器,你不会调用任何修改异常的函数,这可能有助于优化代码。 可能不会有太大的区别,但这样做的成本也非常小。
如果不是,那就用const吧。同样的道理,你应该在其他地方使用const(我说showuld是因为表面上看不出什么区别,可能会对编译器有帮助,也会帮助代码编写者正确使用你的代码,而不是做一些不该做的事情
异常处理程序,可能是平台特定的,可能会把异常放在有趣的地方,因为他们不希望它们改变?
出于同样的原因,你使用了一个const.