重新抛出const异常引用

时间:2014-03-17 20:03:32

标签: c++ exception

我在一个多项选择题中被问到以下程序在做什么:

catch(const std::exception& e){
  throw e;
}

我回答说是重新抛出 e (答案C)。但答案显然是错误的。

那它在做什么?扔一份 e (答案D)?

另一个可能的答案是:A)处理异常B)捕获e中的当前堆栈跟踪

由于

3 个答案:

答案 0 :(得分:10)

throw语句复制了它的参数。这意味着throw e;切片e到它的基类(或者e的静态类型)。要重新抛出原始异常,请使用throw;

答案 1 :(得分:2)

它会抛出e的副本。答案D是正确的。

简单地重新投掷:

catch(const std::exception& e) {
    throw;
}

答案 2 :(得分:1)

它正在正在做什么<锡> :你重新投掷e。从概念上讲,虽然没有副作用,编译器可以优化掉任何深层副本,但仍会采用e的值副本。

保证没有复制,只需写下throw;