C++ const 引用捕获异常为什么是正确的?

C++ 使用const引用捕获异常 没有问题吗?如图所示,函数抛出临时对象应该是放在栈上的,捕获的时候使用的是const 引用,引用本质上就是指针,那么在使用引用的时候,对应的临时对象在栈上已经释放了呀?所以...

void MyFunc(int i)
{
    try
    {
        func(i);
    }
    catch(int i)
    {
        switch(i)
        {
            case -1:
                throw Exception(-1, "Invalid Parameter");
                break;
            case -2:
                throw Exception(-2, "Runtime Exception");
                break;
            case -3:
                throw Exception(-3, "Timeout Exception");
                break;
        }
    }
}

int main(int argc, char *argv[])
{
    try
    {
        MyFunc(11);
    }
    catch(const Exception& e)
    {
        cout << "Exception Info: " << endl;
        cout << "   ID: " << e.id() << endl;
        cout << "   Description: " << e.description() << endl;
    }
    catch(const Base& e)
    {
        cout << "catch(const Base& e)" << endl;
    }

    return 0;
}

throw 表达式初始化一个称为异常对象的特殊对象,由编译器管理并驻留在catch可访问的空间。
而&标号,只不过说可以直接操作这个对象而不是从新copy它。
详细可参考 C++ prime 第17章。

补充一下
throw的时候其实创建两个对象,一个本对象,一个根据本地对象拷贝构造的特殊对象
你的那个引用只不过指向了那个特殊对象。不用引用的话,也会再拷贝构造一个对象的。

确实不会抛异常,因为你的func(i)函数正常执行,所以后面的catch语句是不会执行的,再加上如果func(i)没有改变i的值,i的值则始终是MyFunc(11)的入参值11,所以MyFunc(11)函数也正常执行,不会抛异常,不会执行后面的catch语句