抛出对象范围

Cal*_*orm 0 c++ exception-handling exception

我想知道抛出的对象是否遵循c ++中与其他所有相同的范围规则.这是一个例子.

try{
  Error err;
  err.num = 10;
  err.str = "This will be thrown."
  throw err;
}
catch(Error e){
  cout << "Error num is: " << e.num << " error string is: " << e.str << endl;
}
Run Code Online (Sandbox Code Playgroud)

这是否有效或是否errtry块中创建的事实阻止它在catch块中使用?

Mik*_*our 5

我想知道抛出的对象是否遵循c ++中与其他所有相同的范围规则.

抛出的对象本身没有范围,因为范围仅适用于名称,并且没有名称.它有一个稍微特殊的生命周期:它由throw语句构造在某处,然后在处理完异常后销毁.在这种情况下,抛出的对象是一个副本err.此外,由于您按值捕获,捕获的对象e是抛出对象的副本,而不是对象本身.

这是否有效或者err在try块中创建的事实是否阻止它在catch块中使用?

它"有效",你可以访问块中的e(副本err)catch.你不能访问err它自己,因为它超出了范围并在程序离开try块时被销毁; 但是在你离开catch街区之前,副本仍然完好无损.