派生类中的析构函数标记为noexcept(false)

wul*_*jey 5 c++ c++11

有以下代码:

class Member
{
public:
  ~Member() noexcept(false) {}
};

class A
{
public:
  virtual ~A() {}
};

class B : public A
{
public:
  Member m;
};
Run Code Online (Sandbox Code Playgroud)

错误是:

main.cpp:13:7: error: looser throw specifier for ‘virtual B::~B() noexcept (false)’
 class B : public A
       ^
main.cpp:10:11: error:   overriding ‘virtual A::~A() noexcept’
   virtual ~A() {}
           ^
Run Code Online (Sandbox Code Playgroud)

为什么B类中的析构函数被标记为noexcept(false)?它似乎以某种方式从Member类中获取它.它是由g ++ 6.3编译的.

Fra*_*eux 9

B析构函数会破坏m,这不是一个noexcept操作.你不能确定~B不会抛出,所以它也是noexcept(false).

请参见http://en.cppreference.com/w/cpp/language/destructor#Implicitly-declared_destructor:

[...]实际上,隐式析构函数是noexcept,除非该类被析构函数为noexcept(false)的基数或成员"中毒".