C++20 上的异常规范出现 clang 错误

问题描述 投票:0回答:1

此代码可以在 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
似乎都需要触发错误。

c++ c++20 clang++ exception-specification
1个回答
0
投票

如何修复此代码?

虽然我不知道这是否是一个 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() {
} 

工作演示

© www.soinside.com 2019 - 2024. All rights reserved.