2015-03-05 7 views
16
inline void my_assert(bool cond, const std::exception &e = my_assert_failed()) 
{ 
    if (!cond) 
     throw e; 
} 

मानक सुनिश्चित करता है कि:संदर्भ द्वारा पारित एक अस्थायी तर्क फेंक

एक समारोह कॉल में एक संदर्भ पैरामीटर (5.2.2) के लिए एक अस्थायी बाध्य बनी रहती है जब तक पूर्ण अभिव्यक्ति के पूरा होने से युक्त कहते हैं।

और एक फेंक दिया अस्थायी वस्तु के लिए:

अस्थायी रूप में लंबे समय कोई हैंडलर कि अपवाद के लिए क्रियान्वित किया जा रहा है के रूप में बनी हुई है।

क्या मैं अनुमान लगा सकता हूं कि my_assert पर एक अस्थायी है जो कैच ब्लॉक समाप्त होने तक जीवित रहता है?

+3

'throw' [अभिव्यक्ति] (http://en.cppreference.com/w/cpp/language/throw) करता है इसकी बहस की एक प्रति ताकि आप अस्थायी नहीं फेंक रहे हों। – user657267

+4

@ user657267 यह एक उत्तर है। – Angew

उत्तर

9
N4296 से

(पहला मसौदा अंतिम सी ++ 14 के बाद) [15.1p3]:

फेंकने एक अपवाद कॉपी-initializes (8.5, 12.8) एक अस्थायी वस्तु, अपवाद वस्तु कहा जाता है। अस्थायी एक लवल्यू है और मिलान करने वाले हैंडलर (15.3) में घोषित चर को प्रारंभ करने के लिए का उपयोग किया जाता है।

तो आप यह नहीं मान सकते कि आपका अस्थायी "फेंकता है"। फेंकने पर, std::exception के अपवाद ऑब्जेक्ट की कॉपी कन्स्ट्रक्टर को तर्क के रूप में e के साथ बुलाया जाएगा। e को अस्थायी रूप से नष्ट कर दिया जाएगा जब नियंत्रण my_assert पर कॉल की पूरी अभिव्यक्ति को छोड़ देता है (या तो सामान्य रिटर्न के बाद या अवांछित स्टैक के हिस्से के रूप में, क्योंकि आप सशर्त रूप से अपवाद फेंक रहे हैं)।

कुछ ऐसी परिस्थितियां जब अपवाद वस्तु की प्रतिलिपि निर्माण elided जा सकती हैं, लेकिन यह उनमें से एक [12.8p31.2] के अनुसार नहीं है,:

- एक थ्रो-अभिव्यक्ति में (5.17), जब ऑपरेंड गैर-अस्थिर स्वचालित ऑब्जेक्ट () फ़ंक्शन या कैच-क्लॉज पैरामीटर के अलावा अन्य का नाम है) जिसका दायरा सबसे पहले के अंतराल से आगे नहीं बढ़ता है (यदि वहां है एक), से कॉपी/मूव ऑपरेशन अपवाद ऑब्जेक्ट (15.1) के लिए ऑपरेंडद्वारा छोड़ा जा सकता है 210 स्वत: वस्तु अपवाद वस्तु में सीधे निर्माण

(जोर मेरा)

+1

महान उत्तर, सटीक और ध्वनि। प्रश्न को "फेंकने से बचने" को तेज करने के लिए संपादित किया गया। –

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