为什么抛出作为引用的异常会调用复制构造函数?
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;
}
没关系。
答案 0 :(得分:7)
你不能抛出参考。 Throwing always copies the thrown expression value into a special area of storage set aside for thrown objects。否则,你几乎总是"捕捉"一个悬空引用,[理论上]就是你代码中的情况。
无法复制Error
类型,因此无法执行该程序。
但是,当然可以复制指针,最后一个例子中的主要问题是内存泄漏。此外,由于您没有任何throw
/ try
,您的计划只会在catch
声明处终止。