#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)
,您正在兑现 promise 。
但是不要抛出析构函数:throwing exceptions out of a destructor