此代码可以在 gcc 和 msvc 上编译,但不能在 C++20 上使用 clang 编译:
#include <type_traits>
class IBase {
protected:
IBase() noexcept = default;
public:
virtual ~IBase() noexcept = default;
};
class Derived : public IBase {
public:
virtual ~Derived() noexcept(
std::is_nothrow_destructible<IBase>::value) override = default;
};
直到 C++17 为止,gcc、msvc 和 clang 都会编译此代码,但从 C++20 开始,clang 会拒绝它,并显示
error: exception specification is not available until end of class definition
。
这是一个 clang bug,还是相反,C++20 中异常规范的更改?我该如何修复此代码?
[编辑]根据评论,这是一个“更最小的可重现示例”:
class IBase {
public:
virtual ~IBase() noexcept = default;
};
class Derived : public IBase {
public:
~Derived() noexcept(true) override = default;
};
请注意,继承和
= default
似乎都需要触发错误。
如何修复此代码?
虽然我不知道这是否是一个 clang bug,但如果你真的想要 =default
dtor,我确实知道一个
解决方法。
特别是,您可以在
=default
类之外 Derived
,如下所示。
class Derived : public IBase {
public:
~Derived() noexcept(true) ;
};
//default outside the class
Derived::~Derived() noexcept(true)= default;
int main() {
}