मान लीजिए मैं:सी ++ 11 में डिफॉल्ट वर्चुअल डिस्ट्रक्टर के लिए अपवाद विनिर्देश क्या है?
class Foo
{
public:
virtual ~Foo()=default;
};
डिफॉल्ट नाशक पर अपवाद-विनिर्देश क्या है?
virtual ~Foo() {};
or
virtual ~Foo() throw() {};
or
virtual ~Foo() noexcept {};
धारा सी ++ 11 मानक के 15.4 कहना है कि वह काम करता है सीधे नाशक का अंतर्निहित परिभाषा द्वारा लाया के अपवाद के विनिर्देशों पर निर्भर करता: डिफॉल्ट नाशक बराबर है। इस मामले में कोई सदस्य नहीं हैं, और कोई आधार वर्ग नहीं है, इसलिए AFAIK को निहित विनाशक द्वारा सीधे कोई कार्य नहीं किया जाता है। क्या यह मानक में एक अस्पष्टता (या चूक) है?
यह निश्चित रूप से महत्वपूर्ण है, क्योंकि अगर यह स्पष्ट रूप से फेंक दिया गया है, तो सभी उप-वर्गों को अपने विनाशकों को फेंक() के साथ घोषित करना होगा। मुझे मत बताओ विनाशकों में अपवाद फेंकना एक बुरा विचार है, मुझे पता है। मैं बहुत सारे विरासत कोड से निपटता हूं जहां अपवाद चश्मे का उपयोग नहीं किया जाता था।
जानकारी का एक बिंदु है, जब मैं करने की कोशिश की के रूप में:
class SubFoo : public Foo
{
public:
virtual ~SubFoo();
};
मैं जीसीसी 4.4 में एक त्रुटि (बेमेल अपवाद चश्मा) मिल गया है (हालांकि मैं मानता हूं मुझे नहीं सही कमांड लाइन स्विच हो सकता था), लेकिन "11" कंपाइलर्स का उपयोग कर एक्सकोड 4.3 में नहीं।
उत्तर के लिए धन्यवाद। कुछ और का पालन करने के लिए, spec का कहना है, "एक विनाशक की घोषणा जिसमें अपवाद-विनिर्देश नहीं है, को पूरी तरह से एक अपवाद घोषित करने के रूप में एक ही अपवाद-विनिर्देश माना जाता है" तो फिर "वर्चुअल ~ सबफू();" (अपवाद के बिना) बीमार नहीं है, जब तक कि यह सीधे उन कार्यों को आमंत्रित न करे जो स्पष्ट रूप से या स्पष्ट रूप से फेंकने की अनुमति देते हैं? – user1414050
@ user1414050: मेरा मानना है कि यह सही है, हाँ - लेकिन हम ' इस भाषा के छायादार पर्याप्त कोनों में शामिल हो रहे हैं कि मैं अभी तक इसे प्राप्त करने वाले अधिकांश कंपाइलरों पर बहुत अधिक शर्त नहीं लगाऊंगा। विशेष रूप से, मुझे संदेह है कि कई (अधिकांश?) कंपाइलर्स 'वर्चुअल ~ सबफू();' अर्थ के रूप में 'फेंक सकते हैं कुछ भी ", जैसा कि यह एक सामान्य कार्य के साथ होगा। –
मुझे लगता है कि यह निष्कर्ष नहीं हो सकता है, क्योंकि" अगर और केवल अगर "को अनुमति के बारे में निम्नलिखित भाग-वाक्य द्वारा विरोधाभास किया गया है जी सभी अपवाद (यानी, मानक यहां आत्म-विरोधाभासी है)। और मुझे लगता है कि यह संदिग्ध है अगर इरादा यह है कि विनाशकों ने डिफ़ॉल्ट रूप से कोई फेंक दिया नहीं है। क्योंकि यह सी ++ 03 के साथ असंगत होगा। –