有以下代码:
class Member
{
public:
~Member() noexcept(false) {}
};
class A
{
public:
virtual ~A() {}
};
class B : public A
{
public:
Member m;
};
错误是:
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() {}
^
为什么B类中的析构函数被标记为noexcept(false)?它似乎以某种方式从Member类中获取它。它由g ++ 6.3编译。
答案 0 :(得分:9)
B
的析构函数将销毁m
,这不是noexcept
操作。您无法确定~B
是否会抛出,因此它也是noexcept(false)
。
请参阅http://en.cppreference.com/w/cpp/language/destructor#Implicitly-declared_destructor:
[...]在实践中,隐式析构函数是noexcept,除非该类被析构函数为noexcept(false)的基数或成员“中毒”。