अपवाद विनिर्देशक क्योंकि exception specifiers are generally a terrible idea पदावनत किया गया। noexcept
जोड़ा गया था क्योंकि यह एक अपवाद विनिर्देशक का एक उचित रूप से उपयोगी उपयोग है: यह जानना कि जब कोई फ़ंक्शन अपवाद फेंक नहीं देगा। इस प्रकार यह एक द्विआधारी विकल्प बन जाता है: फंसे जो फेंक देंगे और काम करेंगे जो फेंक नहीं देंगे।
noexcept
throw()
के अलावा सभी फेंक विनिर्देशकों को हटाने के बजाय जोड़ा गया था क्योंकि noexcept
अधिक शक्तिशाली है। noexcept
में एक पैरामीटर हो सकता है जो संकलन-समय एक बूलियन में हल हो जाता है। यदि बूलियन सत्य है, तो noexcept
चिपक जाती है। यदि बूलियन झूठा है, तो noexcept
चिपकता नहीं है और फ़ंक्शन फेंक सकता है।
इस प्रकार, आप कुछ इस तरह कर सकते हैं:
struct<typename T>
{
void CreateOtherClass() { T t{}; }
};
CreateOtherClass
फेंक अपवाद है? यह हो सकता है, अगर T
का डिफ़ॉल्ट कन्स्ट्रक्टर कर सकता है। हम कैसे बताते हैं? इस तरह:
struct<typename T>
{
void CreateOtherClass() noexcept(is_nothrow_default_constructible<T>::value) { T t{}; }
};
इस प्रकार, CreateOtherClass()
फेंक देते हैं iff दिए गए प्रकार के डिफ़ॉल्ट निर्माता फेंकता है। यह अपवाद विनिर्देशकों के साथ प्रमुख समस्याओं में से एक को हल करता है: कॉल स्टैक को प्रसारित करने में उनकी असमर्थता।
आप throw()
के साथ ऐसा नहीं कर सकते हैं।
स्रोत
2012-10-11 06:23:36
इस [अच्छा आलेख] (http://akrzemi1.wordpress.com/2011/06/10/using-noexcept/) को समाहित करने के लिए भी 'noexcept' रनटाइम चेक हो सकता है। 'फेंकने' कारणों को तोड़ने के दौरान 'stx :: terminate' को तोड़ने के दौरान' noxcept' को तोड़ने 'का कारण बनता है' std :: अप्रत्याशित '। इन मामलों में थोड़ा अलग स्टैक अवांछित व्यवहार भी। – Fiktik