1

我有一个CustomException实现的类std::exception,在其中我明确删除了复制和移动构造函数。当我抛出该类的异常时,调用已删除的构造函数时会出现编译错误。

是否在某处创建了 CustomException 实例?抛出异常时会创建哪些对象?

4

2 回答 2

5

当你抛出时,会构造一个与 的操作数相同类型的异常对象,但throw移除了顶级 cv 限定符(如果你抛出一个数组或函数,它们也会衰减到它们对应的指针)。

所以你所做的事情是不可行的,我担心。

C++ 标准章节 [except.throw] §5:

当抛出的对象是类对象时,复制/移动构造函数和析构函数应该是可访问的,即使复制/移动操作被省略(12.8)。

于 2014-03-18T06:49:58.020 回答
0

在展开堆栈之前,throw 运算符(除了 throw;不带参数,用于重新抛出)在特殊的内存区域中创建异常对象。根据情况,对象以不同的方式初始化:构造函数、复制构造函数、移动构造函数(https://en.cppreference.com/w/cpp/language/copy_elision)使用提供给 throw 运算符的内容。因此,信息可从异常对象中获得,该对象在完成异常处理之前一直处于活动状态,尽管提供给 throw 运算符的内容在堆栈展开时被销毁)。

在您的情况下,编译器需要您删除的函数来在引发异常时初始化异常对象或初始化 catch-clause 参数,或两者兼而有之 - 因为这是编译器通过设计(使用函数)来完成它的方式。

于 2021-08-27T01:59:40.143 回答