2012-05-29 14 views
9

मैं एक कोड में आए झलकीकॉन्स संदर्भ एक int असाइन किया जा सकता है?

const int& reference_to_const_int = 20; 
cout<<"\n reference_to_const_int = "<<reference_to_const_int<<endl;  

इस कोड को संकलित & उत्पादन के साथ निष्पादित करता है: -

reference_to_const_int = 20 

यह कुछ मेरे लिए में अजीब है। जैसा कि मुझे संदर्भ पता है स्मृति & पर कब्जा नहीं है वे अन्य चर के लिए उपनाम हैं। इसलिए हम यह नहीं कह सकते

int& reference_to_int = 30; 

ऊपर बयान देने त्रुटि संकलन नहीं होगा: -

error: invalid initialization of non-const reference of type ‘int&’ from an rvalue of type ‘int’ 

वास्तव में क्या "स्थिरांक पूर्णांक &" मामले में हो रहा है? एक पूर्ण स्पष्टीकरण वांछित है।

कृपया मदद करें।

धन्यवाद

+2

पढ़ें यह: http://herbsutter.com/2008/01/01/gotw-88-a-candidate-for-the-most-important-const/ –

+0

उसे कुछ अतिरिक्त सोचा देते हुए यह ऐसा लगता है कि यह * कानूनी होना चाहिए। यदि यह नहीं था, तो आप कभी भी अधिक चर बनाने के बिना इसे सेट करने में सक्षम नहीं होंगे। –

+0

@ गीगावाट: "यह" आप किस बारे में बात कर रहे हैं? मेरा विश्वास करो, अगर "यह" * कानूनी होना चाहिए, तो यह * होगा। :) –

उत्तर

11

एक अस्थायी बनाई गई है, और यह एक गैर const एक के लिए यह बाध्य करने के लिए यह करने के लिए एक const संदर्भ आबद्ध करने का कानूनी है, लेकिन अवैध है।

यह सिर्फ तरह है:

const int& reference_to_const_int = int(20); //LEGAL 
     int& reference_to_const_int = int(20); //ILLEGAL 

एक const संदर्भ, एक अस्थायी के जीवन का विस्तार यही कारण है कि इस काम करता है। यह सिर्फ भाषा का एक नियम है।

+0

असाइनमेंट कथन के बाद अस्थायी रूप से बाहर नहीं जाता है, इसलिए प्रिंट स्टेटमेंट एक 'int' का संदर्भ देता है जो दायरे से बाहर हो गया है? –

+3

@FlorianSowade संख्या, कॉन्स संदर्भ एक अस्थायी जीवन का विस्तार करते हैं। –

+4

लेकिन सावधान रहें, कॉन्स संदर्भ सभी मामलों में जीवन भर नहीं बढ़ाते हैं। और यह भी ध्यान रखें कि माइक्रोसॉफ़्ट सी ++ कंपाइलर्स नियम तोड़ते हैं और अस्थायी गैर-'कॉन्स्टेंस को अस्थायी रूप से संदर्भित करने की अनुमति देते हैं। –

5

यह व्यवहार तब समझना आसान होता है जब हम देखते हैं कि जब हम अस्थायी वस्तु के संदर्भ को बाध्य करते हैं तो क्या होता है। अगर हम

const int& reference_to_const_int = 20; //A temporay object int(20) is created. 

लिखने संकलक कुछ इस तरह में कोड ऊपर बदल देती है:

int temp = 20; 
const int& reference_to_const_int = temp; 

तो reference_to_const_int const नहीं कर रहे थे, तो हम एक नया मान reference_to_const_int को आवंटित कर सकते हैं। ऐसा करने से शाब्दिक 20 नहीं बदलेगा, बल्कि बदले में अस्थायी वस्तु होगी, जो अस्थायी वस्तु है और इसलिए पहुंच योग्य नहीं है। केवल स्थिर संदर्भों को अनुमति देने के लिए अस्थायी संदर्भों को अनुमति देना अस्थायी रूप से समस्या को टालता है क्योंकि एक कॉन्स संदर्भ केवल पढ़ने के लिए होता है।

क्यों सी ++ अस्थायी वस्तुओं या RVALUES (जैसे शाब्दिक) स्वीकार करने के लिए कॉन्स संदर्भों की अनुमति देता है?

संदर्भों को देखने वाले सबसे आम स्थान फ़ंक्शन तर्क या वापसी मान के रूप में हैं। जब किसी फ़ंक्शन तर्क के रूप में संदर्भ का उपयोग किया जाता है, तो फ़ंक्शन के अंदर संदर्भ में कोई भी संशोधन फ़ंक्शन के बाहर तर्क में परिवर्तन का कारण बनता है।

यदि फ़ंक्शन अस्थायी वस्तुओं या अक्षरों को इनपुट के रूप में स्वीकार/स्वीकार कर सकता है और यदि फ़ंक्शन ऑब्जेक्ट की कॉन्स्ट-नेस का सम्मान करता है, तो तर्क को एक कॉन्स्ट संदर्भ बनाने से फ़ंक्शन को सभी परिस्थितियों में उपयोग करने की अनुमति मिल जाएगी।

अस्थायी वस्तुएं हमेशा स्थिर होती हैं, इसलिए यदि आप एक कॉन्स्ट संदर्भ का उपयोग नहीं करते हैं, तो यह तर्क संकलक द्वारा स्वीकार नहीं किया जाएगा।

void f(int&) {} 
void g(const int&) {} 
int main() 
{ 
    //f(1); //Error 
    g(1); //OK 
} 
संबंधित मुद्दे