2017-08-30 5 views
5

次のコードがあります:デストラクタ(偽)

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(偽)としてマークされません?それはどういうわけかメンバークラスから取得しているようです。 g ++ 6.3でコンパイルされました。

答えて

9

Bのデストラクタは、noexcept操作ではないmを破棄します。 ~Bが投げられないことを確信することはできませんので、noexcept(false)です。

http://en.cppreference.com/w/cpp/language/destructor#Implicitly-declared_destructorを見る

[...]クラスは、そのデストラクタnoexcept(偽)である塩基又は部材によって「毒」されていない限り、実際には、暗黙のデストラクタはnoexceptあります。