2015-03-08 8 views
7

C++ द्वारा मूल्य पकड़ से फेंक जब की तरह मान द्वारा वस्तु फेंक: फेंक अपवाद(), यह, अस्थायी वस्तु पैदा करेगा कि यह कैसे संदर्भ से पकड़ा जा सकता है? मुझे पता है कि यह काम करता है, लेकिन अगर यह फ़ंक्शन रिटर्न वैल्यू या फ़ंक्शन कॉल था तो यह टाइप करने के लिए कॉन्स्ट जोड़ने के बिना असफल रहा होगा, अंतर क्या है?C++ अपवाद संदर्भ

+4

अपवाद अलग-अलग जानवर हैं, उनके पास अपना स्वयं का अर्थशास्त्र है। –

+0

क्या आप विस्तृत कर सकते हैं? – shd

+0

यह यहाँ एक लंबे विषय है ... विवरण के 3 घंटे हैं: IIRC, स्कॉट Meyers 'पुस्तक https://www.youtube.com/watch?v=W7fIy_54y-w भी विषय पर कुछ अध्याय हैं ... –

उत्तर

6

सबसे पहले, जब आप

throw Exception(); 

क्या फेंक दिया जा रहा है लिखना वास्तव में prvalue अभिव्यक्ति Exception() द्वारा बनाई गई अस्थायी वस्तु नहीं है। संकल्पनात्मक रूप से, एक अलग वस्तु है - अपवाद वस्तु - जिसे उस अस्थायी वस्तु से प्रारंभ किया गया है, और यह अपवाद वस्तु है जो वास्तव में फेंक दी गई है। (संकलनकर्ता कॉपी/कदम छिपाना है, हालांकि अनुमति दी जाती है।)

दूसरा, भाषा के नियमों का कहना है कि अपवाद वस्तु हमेशा एक lvalue माना जाता है। इसलिए इसे गैर-कॉन्स लैवल संदर्भों से बांधने की अनुमति है।

संबंधित मुद्दे