struct A {
A(int) : i(new int(783)) {
std::cout << "a ctor" << std::endl;
}
A(const A& other) : i(new int(*(other.i))) {
std::cout << "a copy ctor" << std::endl;
}
~A() {
std::cout << "a dtor" << std::endl;
delete i;
}
void get() {
std::cout << *i << std::endl;
}
private:
int* i;
};
const A& foo() {
return A(32);
}
const A& foo_2() {
return 6;
}
int main()
{
A a = foo();
a.get();
}
मुझे पता है, स्थानीय मानों के संदर्भ वापस करना बुरा है। लेकिन, दूसरी ओर, कॉन्स संदर्भ एक अस्थायी वस्तु जीवनकाल का विस्तार करना चाहिए।स्थानीय ऑब्जेक्ट को संदर्भित करने के संदर्भ में वास्तव में क्या होता है?
यह कोड एक यूबी आउटपुट उत्पन्न करता है। तो कोई जीवन विस्तार नहीं।
क्यों? मेरा मतलब है कि कोई व्यक्ति बता सकता है कि चरण-दर-चरण क्या हो रहा है?
मेरी तर्क श्रृंखला में गलती कहां है?
foo():
एक (32) - ctor
वापसी एक (32) - स्थानीय ऑब्जेक्ट में एक स्थिरांक संदर्भ बनाई गई है और
एक एक दिया जाता है = foo(); - foo() लौटा मूल्य द्वारा प्रारंभ किया गया है, लौटाया गया मूल्य दायरे से बाहर चला जाता है (अभिव्यक्ति से बाहर) और नष्ट हो जाता है, लेकिन पहले ही प्रारंभ हो चुका है;
(लेकिन असल में नाशक प्रतिलिपि निर्माता से पहले कहा जाता है)
foo_2():
वापसी 6 - ग्रुप ए के अस्थायी वस्तु परोक्ष इस वस्तु के लिए एक स्थिरांक संदर्भ बनाई गई है बनाया गया है (इसके जीवन का विस्तार) और
ए = foo(); - foo() लौटा मूल्य द्वारा प्रारंभ किया गया है, लौटाया गया मूल्य दायरे से बाहर चला जाता है (अभिव्यक्ति से बाहर) और नष्ट हो जाता है, लेकिन पहले ही प्रारंभ हो चुका है;
(लेकिन असल में नाशक प्रतिलिपि निर्माता से पहले कहा जाता है)
"कॉन्स्ट रेफरेंस को अस्थायी ऑब्जेक्ट आजीवन का विस्तार करना चाहिए" <- erm, जब ऑब्जेक्ट-आजीवन गैर-कॉन्स और कॉन्स संदर्भों की बात आती है तो यह बराबर होती है और * इसे * विस्तारित नहीं करती है। – Giel
मुझे लगता है कि अलेक्जेंडर जीवनकाल को विस्तारित करने के मामले में बात कर रहा है: http://herbsutter.com/2008/01/01/gotw-88-a-candidate-for-the-most-important-const/ – vmpstr
@Giel: सं। संदर्भ संदर्भ ** ** अस्थायी वस्तु का जीवनकाल बढ़ा सकते हैं। जब अस्थायी लोगों के साथ काम करने की बात आती है तो कॉन्स्ट- और गैर-कॉन्स संदर्भ काफी भिन्न होते हैं। इस मामले में यह ओपी की अपेक्षा करने के लिए अलग-अलग काम करता है। – AnT