अपवाद विशिष्टताओं को हटा दिया गया था क्योंकि अपवाद विनिर्देशक आमतौर पर एक भयानक विचार हैं । 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()
।
noexcept
रनटाइम चेक को भी रोका जा सकता है। उनके बीच मुख्य अंतर यह है कि ब्रेकिंगnoexcept
कारणोंstd::terminate
को तोड़ते समयthrow
कारण बनता हैstd::unexpected
। इन मामलों में थोड़ा अलग स्टैक अनइंडिंग व्यवहार भी।