为什么抛出作为引用的异常调用复制构造函数?

时间:2018-05-16 17:49:27

标签: c++ exception copy-constructor throw

为什么抛出作为引用的异常会调用复制构造函数?

struct Error
{
    Error() {}
    Error(const Error&) = delete;
};

int main()
{
    Error& error = *new Error;

    throw error;
}

编译错误:

error: declared here
     Error(const Error&) = delete;

投掷指针时不会发生:

int main()
{
    Error* error = new Error;

    throw error;
}

没关系。

1 个答案:

答案 0 :(得分:7)

你不能抛出参考。 Throwing always copies the thrown expression value into a special area of storage set aside for thrown objects。否则,你几乎总是"捕捉"一个悬空引用,[理论上]就是你代码中的情况。

无法复制Error类型,因此无法执行该程序。

但是,当然可以复制指针,最后一个例子中的主要问题是内存泄漏。此外,由于您没有任何throw / try,您的计划只会在catch声明处终止。