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

标签 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;
}

没关系。

最佳答案

您不能抛出引用。 Throwing always copies the thrown expression value into a special area of storage set aside for thrown objects .否则,您几乎总是会“捕获”悬空引用,[理论上]您的代码就是这种情况。

无法复制您的错误类型,因此程序无法运行。

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

关于c++ - 为什么抛出引用调用复制构造函数的异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50377175/

相关文章:

c++ - shared_ptr 赋值 - 是否也复制了自定义删除器?

c++ - 像计算机一样思考的策略

c++ - 复制构造函数与 pch 中的 const 成员函数冲突?海湾合作委员会的错误?

c++ - 在 Qt 中迭代和修改 JSON

c++ - char sprintf() 句柄的限制

c# - C# 赋值变量时的异常处理

python - hasattr() 与 try-except block 处理不存在的属性

javascript - 这个异常是如何处理的呢? (在 promise 内的回调中抛出)

c++ - 为什么复制构造函数应该在 C++ 中通过引用来接受它的参数?

c++ - 为链表创建复制构造函数