c++ - 具有 noexcept(false) 的析构函数的类可以从具有 noexcept(true) 的析构函数的基类继承吗
问题描述
场景就像,我想从一些第三方库类继承我的类,其析构函数默认为 noexcept(true)。派生类的析构函数为 noexcept(false),因为它可以抛出异常。有以下代码:
class 3PP
{
public:
virtual ~3PP() {}
};
class B : public 3PP
{
public:
~B() noexcept(false)
};
我在编译时收到此错误。
error: looser throw specifier for ‘virtual B::~B() noexcept (false)’
class B : public 3PP
^
main.cpp:10:11: error: overriding ‘virtual 3PP::~3PP() noexcept’
virtual ~3PP() {}
有没有办法从 3PP 类继承它而不使其析构函数 noexcept(false)
我也想了解将析构函数设为 noexcept(false) 的限制。
解决方案
具有 noexcept(false) 的析构函数的类可以从具有 noexcept(true) 的析构函数的基类继承吗
是的。以下程序格式正确:
struct B {
~B() noexcept = default;
};
struct D : B {
~D() noexcept(false) = default;
};
但是,如果基函数为 noexcept,则可能不会抛出虚函数的覆盖。因此,如果 base 有一个虚拟的noexcept 析构函数,你就不能有一个潜在的抛出析构函数。
推荐阅读
- python - 检查用户是否在 discord.py 中具有权限
- python - 如何在numpy线性方程组求解器中包含大于或等于
- r - 为什么多个模型的准确率高但 ROC AUC 低?
- gatsby - 在 GatsbyJS 站点上更新动态数据
- php - Magento 设置中的 MAMP PHP 扩展 intl 失败
- android - 无法使用适当的约束使 ImageView 居中
- node.js - Node.js - 使用多个流正确关闭 fd
- python - 将python转换为exe文件的问题
- django - 如何从模型字段中获取数据并使用模板中的数据进行计算?
- c# - 查找MCG0007编译器警告的出处