2013-03-30 7 views
24

मैं विनाशकों और noexcept के साथ थोड़ा उलझन में हूं। मेरी समझ यह थी कि सी ++ 11 में उपयोगकर्ता द्वारा परिभाषित समेत किसी भी विनाशक, noexcept(true) है, भले ही हम throw इससे हों। और किसी को स्पष्ट रूप से noexcept(false) निर्दिष्ट करना होगा यदि वे किसी कारण से ऐसा होना चाहते हैं।विनाशक और

जो मैं देख रहा हूं वह काफी विपरीत है - जीसीसी 4.7.2, उपयोगकर्ता द्वारा परिभाषित विनाशक के साथ, कोई फर्क नहीं पड़ता कि वर्ग और विनाशक कैसे प्राचीन हैं, निश्चित रूप से noexcept(false) है। मुझे यहां क्या समझ नहीं आ रहा है? क्या उपयोगकर्ता द्वारा परिभाषित विनाशकों के साथ कुछ छुपा गोचा है?

+4

12,4/3: "एक नाशक का एक घोषणा है कि एक अपवाद-विनिर्देश नहीं है परोक्ष माना जाता है एक अपवाद घोषणा के रूप में एक ही अपवाद-विनिर्देश (15.4) है। " यानी एक विनाशक केवल 'अस्वीकार (सत्य)' है यदि सभी सदस्यों और अड्डों में कोई अपवाद नहीं है। – ipc

उत्तर

16

यह known bug (बग रिपोर्ट खोजने के लिए ओपी को क्रेडिट) है, और ऐसा लगता है कि यह जीसीसी 4.8.0 में तय किया गया है। उदाहरण के लिए, नीचे स्थिर अभिकथन जीसीसी 4.7.2 पर सक्रिय होगा, लेकिन जीसीसी 4.8.0 पर नहीं:

struct X 
{ 
    ~X() { }; 
}; 

int main() 
{ 
    X x; 

    // This will not fire even in GCC 4.7.2 if the destructor is 
    // explicitly marked as noexcept(true) 
    static_assert(noexcept(x.~X()), "Ouch!"); 
} 
+3

मैंने वास्तव में एक अतिरिक्त खोज कीवर्ड के रूप में "बग" का उपयोग करने के बारे में नहीं सोचा था। अब मैंने किया (धन्यवाद) यह आया [बग 56191] (http://gcc.gnu.org/bugzilla/show_bug.cgi?id=56191)। त्वरित उत्तर के लिए धन्यवाद! – lapk

+0

@PetrBudnik: लिंक के लिए धन्यवाद, मैं इसे उत्तर में जोड़ दूंगा! –

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