为什么要把异常作为 reference-to-const 来捕获?

问题描述 投票:79回答:5

我听过和读过很多次,说以 reference-to-const 的方式捕获异常比以 reference 的方式捕获异常要好。为什么是

try {
    // stuff
} catch (const std::exception& e) {
    // stuff
}

比..:

try {
    // stuff
} catch (std::exception& e) {
    // stuff
}
c++ exception const
5个回答
62
投票

你需要:

  • 一个引用,这样你就可以多态地访问异常。
  • 来提高性能,并告诉编译器你不打算修改对象

后者不是 多少 和前者一样重要,但放弃const的唯一真正原因是为了表明你想对异常进行修改(通常只有当你想把它添加上下文后重新扔到更高的级别时才有用)。


29
投票

基本上没有任何理由。

异常对象活在自己的内存空间里 所以你不必担心捕获临时表达式中创建的异常。

你所做的只是承诺不会修改异常对象,但由于异常对象应该有一个不可变的接口------。,这里真的没有什么实用的东西。

然而,当你读到它时,它可能会让你感到温暖和舒适--对我来说就是这样。

它们有自己的、特殊的、线程本地的栈。 声明。 Boost.Exception打破了这一点,以便做一些有趣的事情,并在构造后添加异常细节。但这是黑客行为!它告诉编译器,你不会调用任何修改异常的函数,这可能有助于优化异常。


5
投票

它告诉编译器,你不会调用任何修改异常的函数,这可能有助于优化代码。 可能不会有太大的区别,但这样做的成本也非常小。


1
投票

如果不是,那就用const吧。同样的道理,你应该在其他地方使用const(我说showuld是因为表面上看不出什么区别,可能会对编译器有帮助,也会帮助代码编写者正确使用你的代码,而不是做一些不该做的事情

异常处理程序,可能是平台特定的,可能会把异常放在有趣的地方,因为他们不希望它们改变?


-1
投票

出于同样的原因,你使用了一个const.

© www.soinside.com 2019 - 2024. All rights reserved.