2011-09-13 15 views
8

साइड इफेक्ट्स के साथ एक कॉपी कन्स्ट्रक्टर के साथ एक अपवाद वर्ग पर विचार करें।कैच स्टेटमेंट में एलिजन की प्रतिलिपि बना सकते हैं?

एक संकलक प्रतिलिपि निर्माता यहाँ बुला छोड़ कर सकते हैं:

try { 
    something_that_throws_ugly_exception(); 
} 
catch(ugly_exception) // ignoring the exception, so I'm not naming it 
{ } 

(हाँ, मैं जानता हूँ कि यह सब बहुत बदसूरत है, इस another question से प्रेरित था)

:

try { 
    throw ugly_exception(); 
} 
catch(ugly_exception) // ignoring the exception, so I'm not naming it 
{ } 

क्या इस बारे में

उत्तर

9

हां, इसे फेंकने और पकड़ने के दौरान दोनों को दूर किया जा सकता है। पकड़ने के लिए इसे केवल तभी किया जा सकता है जब कैच क्लॉज में निर्दिष्ट प्रकार एक ही है (सीवी-योग्यता के लिए सहेजें) अपवाद ऑब्जेक्ट के प्रकार के रूप में। अधिक औपचारिक और विस्तृत विवरण के लिए सी ++ 11 12.8/31 देखें।

... कॉपी/कदम आपरेशन के इस इलिजन, कॉपी इलिजन कहा जाता है, निम्नलिखित परिस्थितियों (जो कई प्रतियां खत्म करने के लिए जोड़ा जा सकता है) में की अनुमति दी है:

...

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

में सीधे आपत्ति ...

  • जब अपवाद संचालक (खण्ड 15) के अपवाद-घोषणा (सीवी-योग्यता के लिए छोड़कर) एक ही प्रकार के एक वस्तु के रूप में घोषित किया अपवाद ऑब्जेक्ट (15.1), अपवाद ऑब्जेक्ट के लिए अपवाद के रूप में अपवाद-घोषणा का इलाज करके कॉपी/मूव ऑपरेशन को छोड़ा जा सकता है यदि प्रोग्राम का अर्थ अपरिवर्तित किया जाएगा, तो इसके द्वारा घोषित ऑब्जेक्ट के लिए कन्स्ट्रक्टर और विनाशकों के निष्पादन को छोड़कर अपवाद-घोषणा।
+0

दिलचस्प है, हालांकि उद्धरण काफी संकीर्ण है ... इसलिए यह सुनिश्चित करना मुश्किल है कि यह वास्तव में इस विशेष स्थिति को संदर्भित करता है। –

+0

@Mattieu: मैं सभी प्रासंगिक उद्धरण जोड़ने के बारे में थोड़ा आलसी था, किसी भी तरह, यहां यह है। –

+0

+1 फिर, यहां यह स्पष्ट है कि इसकी अनुमति है। –

0

हां। यदि catchसंदर्भ द्वारा अपवाद को पकड़ता है, तो प्रतिलिपि नहीं होगी (ठीक है, यह परिभाषा के अनुसार है)।

लेकिन मुझे लगता है कि यह आपका प्रश्न नहीं है, और मेरा मानना ​​है कि आपके द्वारा लिखे गए कोड को संदर्भ का कोई उल्लेख नहीं है। यदि ऐसा है, तो हाँ, यहां तक ​​कि इस मामले में, प्रतिलिपि बनाई जा सकती है। वास्तव में catch में चर के प्रारंभिकरण सिद्धांत में प्रत्यक्ष-प्रारंभिक है। और प्रत्यक्ष-प्रारंभिकरण में कॉपी को संकलक द्वारा elided किया जा सकता है जहां यह संभव है।

सी ++ 03 §8.5/14 पढ़ता है,

[...] कुछ मामलों में, एक कार्यान्वयन मध्यवर्ती परिणाम में सीधे निर्माण करके नकल इस डायरेक्ट-प्रारंभ में निहित खत्म करने के लिए अनुमति दी है वस्तु शुरू की जा रही है;

+0

यहाँ कोई संदर्भ नहीं है, केवल इलिजन कॉपी जब पकड़ने द्वारा मूल्य माना जाता है। –

+0

@Matthieu: मेरे उत्तर का अधिकांश हिस्सा उस पते को संबोधित करता है। मुझे लगता है कि आप केवल पहली वाक्य पढ़ते हैं? – Nawaz

+0

मानक उद्धरण के बारे में: यह अस्पष्ट है कि क्या यह सामान्य रूप से कॉपी एलिशन से संबंधित है या केवल 'पकड़' के बारे में है, क्या आप सटीक हो सकते हैं? –

4

मुझे लगता है कि यह विशेष रूप से अनुमति है। सी ++ 03, 15 के लिए।1/3 कहते हैं:

एक थ्रो-अभिव्यक्ति एक अस्थायी वस्तु initializes, कहा जाता अपवाद वस्तु,

और 12/15 का कहना है: जब एक अस्थायी वर्ग वस्तु

कि संदर्भ (12.2) को एक क्लास ऑब्जेक्ट में प्रतिलिपि नहीं किया जाएगा, उसी सीवी-अयोग्य प्रकार के साथ, कॉपी ऑपरेशन को टेम्पो - रैरी ऑब्जेक्ट को सीधे बनाकर छोड़ा जा सकता है छोड़े गए प्रतिलिपि

तो की लक्ष्य में, गुप्त छिपने की जगह जहां में उड़ान अपवाद रखा जाता है, मानक द्वारा परिभाषित किया गया है एक अस्थायी हो सकता है, और इसलिए कॉपी-इलिजन लिए मान्य है।

संपादित करें: ओह, मैंने अब और पढ़ा है। 15.1/5:

अस्थायी वस्तु के उपयोग अस्थायी वस्तु (12.2) के इस्तेमाल से जुड़े कंस्ट्रक्टर्स और विनाशकर्ता के निष्पादन के लिए छोड़कर कार्यक्रम के अर्थ को बदले बिना समाप्त किया जा सकता है, तो तो हैंडलर में अपवाद को फेंक अभिव्यक्ति के तर्क के साथ सीधे प्रारंभ किया जा सकता है।

अधिक स्पष्ट नहीं मिलता है।

चाहे वह वास्तव में होगा ... यदि पकड़ खंड अपवाद को फिर से उठाना था (जिसमें इसे गैर-दृश्य कोड कहा जाता है), तो कार्यान्वयन की आवश्यकता है कि "अस्थायी वस्तु अपवाद वस्तु कहा जाता है" अभी भी आसपास होना है। तो उस प्रतिलिपि पर संभव होने पर कुछ प्रतिबंध हो सकते हैं। स्पष्ट रूप से एक खाली पकड़ खंड इसे फिर से उठा नहीं सकता है।

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