Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/154.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 编译器错误:析构函数的抛出说明符较松_C++_C++11_Inheritance_Exception_Legacy Code - Fatal编程技术网

C++ 编译器错误:析构函数的抛出说明符较松

C++ 编译器错误:析构函数的抛出说明符较松,c++,c++11,inheritance,exception,legacy-code,C++,C++11,Inheritance,Exception,Legacy Code,要修复该错误,我看到的唯一选项是将noexcept(false)添加到类ICantChange的析构函数中,因为它是一个库类,所以我不能这样做 我知道抛出析构函数是不好的,但现在我有了Test类,我想捕获当它被析构函数抛出的异常 有人能提出解决方案吗?您遇到的问题是析构函数或noexcept(true),因此,通过添加noexcept(false)的成员,您就违背了承诺 但不要加入析构函数:您可以在析构函数内部处理异常。还要注意的是,您将需要再次运行析构函数,以便对象实际被析构函数。如何执行?您

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

我知道抛出析构函数是不好的,但现在我有了
Test
类,我想捕获当它被析构函数抛出的异常


有人能提出解决方案吗?

您遇到的问题是析构函数或
noexcept(true)
,因此,通过添加
noexcept(false)
的成员,您就违背了承诺


但不要加入析构函数:

您可以在析构函数内部处理异常。还要注意的是,您将需要再次运行析构函数,以便对象实际被析构函数。如何执行?您可以共享代码吗?捕获异常与引发异常不同。只需使用try/catch,就像@VTT所说的那样,重新运行析构函数。但它不会挂起异常,对吗?程序仍将中止?请查看以下内容:
#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() {}