抛出异常为const&

时间:2012-01-19 14:35:16

标签: c++ exception const

采取以下代码;

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&但是作为一个非常规的&。抓住了。

问题 - 应该吗? : - )

2 个答案:

答案 0 :(得分:9)

throw接受一个表达式,并通过复制初始化创建一个基于该表达式的静态类型的异常对象。异常对象不是const对象。

catch语句初始化对异常对象的引用,而不是throw表达式引用的对象(如果有)。

答案 1 :(得分:0)

我不知道规范说的是什么,但在我看来,在实践中,使用RTTI将一个异常调度到正确的“catch”块(一些编译器合成代码必须这样做),“const” “无关紧要。