सी ++ 11 इस में अब मान्य नहीं है:क्यों "गतिशील अपवाद" गारंटी ओवरहेड का कारण बनती है?
void foo() throw();
और बदला
void foo() noexcept;
द्वारा this article में यह समझाया गया है कि इस का कारण (दूसरों के बीच, कि एक ही बात करने के लिए नीचे फोड़ा) यह है कि
सी ++ अपवाद विनिर्देशों को संकलित समय के बजाए रनटाइम पर चेक किया जाता है, इसलिए वे कोई प्रोग्रामर गारंटी नहीं देते हैं कि सभी अपवादों को संभाला गया है।
यह मेरे लिए कोई मतलब करता है, मुझे समझ नहीं आता क्यों throw()
पहली जगह में गतिशील रूप से जांच की गई, या क्यों noexcept
सामान्य स्टैक के बजाय std::terminate
बुला (जो नहीं है के अलावा अन्य अपवाद गारंटी प्रदान नहीं करता है वास्तव में एक ठोस गारंटी आईएमओ)।
यह जांचना संभव नहीं होगा कि अपवादों को फेंक दिया गया है या नहीं संकलन समय के दौरान और यदि ऐसा होता है तो संकलन विफल हो जाएंगे? मैं इसे देखना, वहाँ मूलतः तीन मामलों रहे हैं:
void foo() noexcept
{
// 1. Trivial case
throw myexcept();
// 2. Try-catch case
// Necessary to check whether myexcept is derived
// from exception
try
{
throw myexcept();
}
catch(exception const & e)
{}
// 3. Nested function call
// Recursion necessary
bar();
}
सी ++ हर प्रकार के instantiated जा रहा है में टेम्पलेट्स के साथ
, आवेदन संकलन हमेशा के लिए वैसे भी लेता है - तो क्यों noexcept
परिवर्तन नहीं की जाँच करने के लिए कि क्या अपवाद दौरान फेंक दिया जाता है संकलक मजबूर करने के लिए समय संकलित करें?
मुझे लगता है कि एकमात्र कठिनाई यह है कि एक रन रनटाइम राज्यों के आधार पर फेंक सकता है या नहीं भी हो सकता है - लेकिन उस समारोह को मेरी राय में noexcept
खुद को कॉल करने की अनुमति नहीं दी जानी चाहिए।
क्या मुझे कुछ याद आ रहा है, या संकलन समय को आगे बढ़ाने के लिए या कंपाइलर डेवलपर्स पर आसान नहीं होने का इरादा था?
कंपाइलर को यह जानने का कोई तरीका नहीं है कि कहें, एक लाइब्रेरी फ़ंक्शन जिसे आप अपने फ़ंक्शन में कॉल करते हैं, अपवाद फेंकता है। – lapk
'फेंक()' एक गारंटी है कि संकलक आपको बनाता है। 'noexcept' एक गारंटी है जो आप कंपाइलर को करते हैं। –
@PetrBudnik: बेशक, कोई भी फ़ंक्शन 'अस्वीकरण' के रूप में चिह्नित नहीं किया जा सकता है। –