2013-07-06 8 views
5

पर संदर्भ तर्क असाइन करना क्या निम्न कोड किसी भी प्रकार के कार्यान्वयन-परिभाषित या अपरिभाषित व्यवहार का आह्वान करता है? मैं अनिश्चित कैसे संदर्भ के साथ बातचीत कर रहा है और मेरी Google कर रहा हूँ/एसओ खोजें खाली आ रहे हैं:स्थानीय चर

struct S { 
    int i; 
}; 

void Fn(S& s_arg) { 
    S s_fn{s_arg.i+1}; 
    s_arg = s_fn; 
} 

int main(int argc, char** argv) { 
    S s_main{15}; 
    Fn(s_main); 
    return 0; 
} 

मैं अनिश्चित जिनमें से दो होने चाहिए हूँ जब काम Fn में होता है:

  1. एस के डिफ़ॉल्ट प्रति असाइनमेंट ऑपरेटर s_main पर शुरू हो जाती है (s_arg संदर्भ का लक्ष्य किया जा रहा है), डेटा main के में (Fn करने के लिए) s_fn स्थानीय से कॉपी स्थानीय s_main (s_arg संदर्भ, सब कुछ उचित बनाने के माध्यम से और हम ll से परिभाषित।
  2. संदर्भ स्वयं ही असाइन किया गया है और अब Fn के स्थानीय s_fn को संदर्भित करता है। Fn अब स्थानीय डेटा का संदर्भ लौटा रहा है और कार्यक्रम अब main से दूसरे फ़ंक्शन के लिए प्रतीक्षा कर रहा है, Fn के स्थानीय s_fn ओवरराइटिंग और सामान्य तबाही का कारण बन रहा है।

उत्तर

3

यहां कोई यूबी नहीं है, संदर्भ बिंदु s_main है और आप s_fn के s_arg (जो s_main को इंगित कर रहा है) के मान को असाइन कर रहे हैं और सब ठीक है। याद रखें कि प्रारंभ किए जाने के बाद संदर्भ (पॉइंटर्स के विपरीत) स्मृति में किसी अन्य क्षेत्र को इंगित नहीं कर सकते हैं जिसका अर्थ है कि आपके द्वारा उल्लिखित दूसरा मामला नहीं हो सकता है।

+0

आह, मुझे लगता है कि संदर्भों के इलाज के लिए मुझे यही लगता है कि मुझे लगता है कि गौरवशाली पॉइंटर्स के रूप में मुझे लगता है। मुझे लगता है कि वे स्मृति में किसी अन्य क्षेत्र को इंगित नहीं कर सकते हैं क्योंकि इस मामले की तरह संदर्भ का कोई असाइनमेंट हमेशा ऑब्जेक्ट के असाइनमेंट ऑपरेटर को आमंत्रित करता है? – user2555367

+0

@ user2555367: पॉइंटर्स की बजाय उपनाम (दूसरा नाम) के रूप में संदर्भों के बारे में सोचना बेहतर है। –

2

सी ++ संदर्भों को "संशोधित" नहीं किया जा सकता है या शुरू में किए गए किसी भिन्न ऑब्जेक्ट को संदर्भित नहीं किया जा सकता है। यह आपकी संभावना # 2 का नियम है। कोड ठीक है।

3

संदर्भ (पॉइंटर्स के विपरीत) में उनका "पता" नहीं बदला जा सकता है। इसलिए, असाइनमेंट ऑपरेटर का आह्वान किया जाता है।

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