以下代码是合法的吗?
class C
{
virtual ~C() noexcept = default;
};
或
class C
{
virtual ~C() throw() = default;
};
(throw()已弃用,但我的编译器不支持noexcept ;;)
答案 0 :(得分:4)
8.4.2 [dcl.fct.def.default] 明确默认的函数[...]只有在与异常兼容(15.4)时才有明确的异常规范 - 隐含声明中的特定内容。
15.4 / 3 [except.spec] 如果符合以下条件,则两个异常规范兼容:
- 两者都是非投掷品(见下文),无论其形式如何,
- 都具有noexcept(constant-expression)形式,而constant-expression是等价的,或
- 两者都是具有相同调整类型集的动态异常规范。
因此,如果它与析构函数的隐式声明完全匹配,那么你只能给出一个明确的异常规范。
隐式析构函数具有的异常规范取决于它将调用的函数:
15.4 / 14 [except.spec] 隐式声明的特殊成员函数应具有异常规范。如果f是一个隐式声明的析构函数,它的隐式异常规范指定了type-id T当且仅当T被f的隐式定义直接调用的函数的异常指定所允许时;如果它直接调用的任何函数允许所有异常,则f应允许所有异常,如果它直接调用的每个函数都不允许异常,则f不允许异常。
析构函数调用的函数是类的非静态数据成员,其基类和虚拟基类的析构函数。
在您的情况下,由于该类没有数据成员且没有基类,因此它不调用任何函数,因此它属于最终情况。它直接调用的每个函数(没有)都不允许异常,所以这个析构函数必须不允许异常。因此,您的异常规范必须是非抛弃的,因此nothrow
,except()
和exception(constant expression that yields true)
是您可以提供的唯一合适的异常规范,因此您的代码很好。< / p>