मैं कुछ अपवादों के मुद्दे पर आया हूं जो मेरे लिए अस्पष्ट नहीं हैं। सी ++ में, जब किसी ऑब्जेक्ट को फेंक दिया जाता है तो इसे पहले अस्थायी ऑब्जेक्ट में कॉपी किया जाता है, और अस्थायी ऑब्जेक्ट को पकड़ने वाले कोड पर भेज दिया जाता है। प्रतिलिपि में ऑब्जेक्ट की क्लास कॉपी कन्स्ट्रक्टर का उपयोग शामिल है। 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;
}
क्या यह कानूनी है?
कोशिश और कॉल के क्रम को देखें, शायद चीजें निष्पादित नहीं होती हैं जैसा कि आपको लगता है कि वे करते हैं। – selalerer
मुझे वीएस -2010 के साथ समान व्यवहार मिलता है लेकिन यह जीसीसी v4.3.4 के साथ [यहां] (http://ideone.com/RlOjl) विफल रहता है। – hmjd
यह हो सकता है कि अस्थायी वस्तु का निर्माण किया गया हो, और प्रति को अनुकूलित किया गया है। वापसी मूल्य अनुकूलन के समान। –