2017-08-30 17 views
5

Có mã sau:Destructor trong lớp có nguồn gốc đánh dấu là noexcept (false)

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

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

class B : public A 
{ 
public: 
    Member m; 
}; 

Lỗi này là:

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() {} 
     ^

Tại sao destructor trong lớp B được đánh dấu là noexcept (false) ? Có vẻ như nó bằng cách nào đó lấy nó từ lớp Member. Nó được biên soạn bởi g ++ 6.3.

Trả lời

9

B của destructor sẽ phá hủy m, mà không phải là một hoạt động noexcept. Bạn không thể chắc chắn rằng ~B sẽ không ném, vì vậy nó cũng là noexcept(false).

Xem http://en.cppreference.com/w/cpp/language/destructor#Implicitly-declared_destructor:

[...] Trong thực tế, destructors ngầm là noexcept trừ khi lớp được "đầu độc" bởi một cơ sở hoặc thành viên có destructor là noexcept (false).

Các vấn đề liên quan