采取以下代码;
void DoThrow( const std::exception& e )
{
throw e;
}
int main( int nArgs, char* args[] )
{
std::exception e;
try
{
DoThrow( e );
}
catch( std::exception& e )
{
// const exception ref is caught
}
return 0;
}
我正在尝试在我的项目中改进const正确性并且无意中创建了上述情况。就目前而言,在Dev Studio中,catch块可以捕获异常,尽管它被抛出作为const&但是作为一个非常规的&。抓住了。
问题 - 应该吗? : - )
答案 0 :(得分:9)
throw
接受一个表达式,并通过复制初始化创建一个基于该表达式的静态类型的异常对象。异常对象不是const
对象。
catch
语句初始化对异常对象的引用,而不是throw
表达式引用的对象(如果有)。
答案 1 :(得分:0)
我不知道规范说的是什么,但在我看来,在实践中,使用RTTI将一个异常调度到正确的“catch”块(一些编译器合成代码必须这样做),“const” “无关紧要。