2012-04-11 9 views
11

मैं कुछ अपवादों के मुद्दे पर आया हूं जो मेरे लिए अस्पष्ट नहीं हैं। सी ++ में, जब किसी ऑब्जेक्ट को फेंक दिया जाता है तो इसे पहले अस्थायी ऑब्जेक्ट में कॉपी किया जाता है, और अस्थायी ऑब्जेक्ट को पकड़ने वाले कोड पर भेज दिया जाता है। प्रतिलिपि में ऑब्जेक्ट की क्लास कॉपी कन्स्ट्रक्टर का उपयोग शामिल है। AFAIK, इसका मतलब है कि यदि किसी वर्ग में एक निजी प्रतिलिपि निर्माता होता है, तो इसे अपवाद के रूप में उपयोग नहीं किया जा सकता है। हालांकि, वीएस -2010 में, निम्नलिखित कोड संकलित और चलाता है:निजी कॉपी कन्स्ट्रक्टर के साथ ऑब्जेक्ट फेंक दिया जा सकता है?

class Except 
{ 
    Except(const Except& other) { i = 2; } 
public: 
    int i; 
    Except() : i(1) {} 
}; 

int main() 
{ 
    try 
    { 
     Except ex1; 
     throw ex1;   // private copy constructor is invoked 
    } 
    catch (Except& ex2) 
    { 
     assert(ex2.i == 2); // assert doesn't yell - ex2.i is indeed 2 
    } 
    return 0; 
} 

क्या यह कानूनी है?

+0

कोशिश और कॉल के क्रम को देखें, शायद चीजें निष्पादित नहीं होती हैं जैसा कि आपको लगता है कि वे करते हैं। – selalerer

+1

मुझे वीएस -2010 के साथ समान व्यवहार मिलता है लेकिन यह जीसीसी v4.3.4 के साथ [यहां] (http://ideone.com/RlOjl) विफल रहता है। – hmjd

+0

यह हो सकता है कि अस्थायी वस्तु का निर्माण किया गया हो, और प्रति को अनुकूलित किया गया है। वापसी मूल्य अनुकूलन के समान। –

उत्तर

13

यह कानूनी नहीं है। स्टैंडर्ड 15,1/5

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

+0

वाह यह आश्चर्यजनक है, कभी अनुमान लगाया नहीं होगा कि यह हो सकता है। धन्यवाद। – petric

2

नहीं, ऐसा नहीं है।

15.1.5 जब फेंका वस्तु एक वर्ग वस्तु, कॉपी/कदम निर्माता है और नाशक सुलभ होगा, भले ही कॉपी/कदम आपरेशन elided है प्रिंट या डिबगिंग जोड़ने

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