अपवाद विशिष्टताओं को हटा दिया गया था क्योंकि अपवाद विनिर्देशक आमतौर पर एक भयानक विचार हैं । 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। इन मामलों में थोड़ा अलग स्टैक अनइंडिंग व्यवहार भी।