编译器错误:destuctor 的更宽松的抛出说明符

Compiler error: looser throw specifier for destuctor

本文关键字:说明符 错误 destuctor 编译器      更新时间:2023-10-16
#include <iostream>    
struct ICantChange
{
virtual ~ICantChange() {}
};
struct ClassThatThrows
{
virtual ~ClassThatThrows() noexcept(false)
{
throw 44;
}
};    
struct Test : ICantChange
{
~Test() 
{
}    
ClassThatThrows instance;
};
main()
{
try 
{
Test obj;
}
catch(int except)
{
std::cout << "caught" << std::endl;
}
}

此代码给出错误消息:

main.cpp:20:5: error: looser throw specifier for ‘virtual Test::~Test() noexcept (false)’
~Test()
^
main.cpp:6:13: error:   overriding ‘virtual ICantChange::~ICantChange() noexcept’
virtual ~ICantChange() {}

要修复该错误,我看到的唯一选择是将noexcept(false)添加到类ICantChange的析构函数中,因为我是库类,所以我不能。

我知道抛弃析构函数是不好的,但现在我有Test类,我想捕获在它被破坏时抛出的异常。

任何人都可以提出解决方案吗?

您遇到的问题是析构函数或noexcept(true),因此通过添加一个noexcept(false)的成员,您正在违反该承诺。

但不要抛出析构函数:抛出析构函数中的异常