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

And*_*iov 0 c++ exception copy-constructor throw

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

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

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

    throw error;
}
Run Code Online (Sandbox Code Playgroud)

编译错误:

error: declared here
     Error(const Error&) = delete;
Run Code Online (Sandbox Code Playgroud)

投掷指针时不会发生这种情况:

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

    throw error;
}
Run Code Online (Sandbox Code Playgroud)

还行吧.

Lig*_*ica 7

你不能抛出参考.抛出总是将抛出的表达式值复制到为抛出的对象留出的特殊存储区域.否则,你几乎总是"抓住"一个悬空引用,[理论上]就是代码中的情况.

您的Error类型无法复制,因此该程序是不可能的.

但是,当然可以复制指针,最后一个示例中的主要问题是内存泄漏.此外,您的程序将在throw声明中终止,因为您没有任何try/ catch.