सी ++ 11 §12.1/14 का निर्माण:स्थिरांक वस्तु
एक स्थिरांक वस्तु के निर्माण के दौरान, अगर वस्तु या उसके subobjects के किसी भी मूल्य एक lvalue के माध्यम से पहुँचा है कि नहीं कन्स्ट्रक्टर के पॉइंटर से सीधे, अप्रत्यक्ष रूप से प्राप्त किया गया, इस प्रकार प्राप्त वस्तु या उपरोक्त का मूल्य निर्दिष्ट नहीं है। [उदाहरण:
struct C;
void no_opt(C*);
struct C {
int c;
C() : c(0) { no_opt(this); }
};
const C cobj;
void no_opt(C* cptr) {
// value of cobj.c is unspecified
int i = cobj.c * 100;
cptr->c = 1;
// value of cobj.c is unspecified
cout << cobj.c * 100 << '\n';
}
ऊपर के उदाहरण संकलन 100
आउटपुट। मेरा सवाल यह है कि cobj.c
का मान निर्दिष्ट क्यों किया जाना चाहिए जब प्रारंभिक सूची इसे कन्स्ट्रक्टर में प्रवेश करने से पहले 0
पर सेट करे? यदि गैर-कॉन्स्ट ऑब्जेक्ट का उपयोग किया जाता है तो यह व्यवहार अलग-अलग कैसे होता है?
मुझे लगता है कि उपरोक्त उदाहरण में 'cobj।'cobj' पूरी तरह से निर्मित होने से पहले सी' का उपयोग किया जाता है। ऐसा लगता है कि गैर-कॉन्स ऑब्जेक्ट्स के लिए भी यह क्रिया संदिग्ध है। –
@MatthieuM। क्यूं कर? मुझे मान्य लगता है (भले ही आप संरचना सी में बेस क्लास जोड़ते हैं)। –
@VJovic: जब तक कि कन्स्ट्रक्टर नहीं चलता है, तब तक ऑब्जेक्ट ज़िंदा नहीं है - सटर के ले लेते हैं [कन्स्ट्रक्टर विफलताओं (या ऑब्जेक्ट्स जो कभी नहीं थे)] (http://www.gotw.ca/publications /mill13.htm)। यदि कोई वस्तु अभी तक जीवित नहीं है, तो इसका उपयोग संदिग्ध है। मैं नहीं कहता कि यह अनिवार्य रूप से अनिर्धारित या अनिर्दिष्ट है, बस यह "खराब गंध" करता है। –