2017-08-30 8 views
5

वहाँ कोड पीछा कर रहा है:नाशक noexcept (गलत) के रूप में चिह्नित

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

है क्यों वर्ग बी में नाशक noexcept के रूप में चिह्नित किया गया है (गलत) ? ऐसा लगता है कि यह किसी भी तरह से सदस्य वर्ग से मिलता है। यह जी ++ 6.3 द्वारा संकलित किया गया था।

उत्तर

9

B का विनाशक m को नष्ट कर देगा, जो noexcept संचालन नहीं है। आप सुनिश्चित नहीं कर सकते कि ~B फेंक नहीं देगा, इसलिए यह noexcept(false) भी है।

http://en.cppreference.com/w/cpp/language/destructor#Implicitly-declared_destructor देखें:

[...] अभ्यास में, निहित विनाशकर्ता noexcept हैं, जब तक कक्षा एक आधार या सदस्य जिसका नाशक noexcept (गलत) है द्वारा "जहर" है।

संबंधित मुद्दे