2013-09-02 16 views
11

क्यों आप इसगैर स्थिरांक lvalue संदर्भ

int a; 
const double &m = a; 

कर सकते हैं लेकिन जब आप इस

int a; 
double &m = a; 

कर आपको कोई त्रुटि मिलती?

error: non-const lvalue reference to type 'double' cannot bind to a value of unrelated type 'int' 

संपादित करें:

अधिक विशिष्ट मैं कारण गैर स्थिरांक संदर्भ अस्थायी वस्तुओं को नहीं बांध सकता को समझने के लिए कोशिश कर रहा हूँ होने के लिए।

+0

इस प्रश्न का दो तरीकों से व्याख्या किया जा सकता है: या तो आपको यह जानने की ज़रूरत है कि एक ऐसा नियम है जो अस्थायी मूल्यों के लिए बाध्यकारी संदर्भों को संदर्भित करता है, या आप तर्क के बारे में जानना चाहते हैं। आपको शायद दोनों प्रकार के उत्तर मिलेंगे, लेकिन आप उनमें से केवल एक में रुचि रखते हैं ... यह कौन है? – DanielKO

+0

मैं तर्क जानना चाहता हूं। – Ares

+1

यहां त्रुटि संदेश थोड़ा उलझन में है। मैं कुछ चीज की अपेक्षा करता हूं - 'त्रुटि: प्रकार' डबल 'प्रकार के रावल्यू से' डबल '' के गैर-कॉन्स्ट संदर्भ के अमान्य प्रारंभिकरण। – Mahesh

उत्तर

12

ऐसा इसलिए है क्योंकि एक अस्थायी गैर-कॉन्स्ट संदर्भ से बंध नहीं सकता है।

double &m = a; 

a प्रकार int की है और double में बदला जा रहा है। तो एक अस्थायी बनाया गया है। उपयोगकर्ता द्वारा परिभाषित प्रकारों के मामले में भी यही मामला है।

Foo &obj = Foo(); // You will see the same error message. 

लेकिन विजुअल स्टूडियो में, यह डिफ़ॉल्ट रूप से सक्षम कंपाइलर एक्सटेंशन की वजह से ठीक काम करता है। लेकिन जीसीसी शिकायत करेगा।

3

क्योंकि अस्थायी पर संशोधन करना व्यर्थ है, सी ++ नहीं चाहते हैं कि आप अस्थायी के लिए गैर-कॉन्स्ट संदर्भ को बाध्य करें। उदाहरण के लिए ।

int a; 
double &m = a; // caution:this does not work. 

यदि यह काम करता है तो क्या होगा? a टाइप int का है और इसे डबल में परिवर्तित किया जा रहा है। तो एक अस्थायी बनाया गया है।

आप m है, जो एक अस्थायी के लिए बाध्य है, लेकिन लगभग कुछ भी नहीं happens.After संशोधन, चर a परिवर्तन नहीं करता है (क्या बदतर है, तो आप सोच सकते हैं a बदल गया है, जो समस्या पैदा हो सकती है) को संशोधित कर सकते हैं।

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