2016-07-31 8 views
19

मैं कुछ इस स्निपेट में व्यवहार को समझने में परेशानी हो रही हूँ से casted पूर्णांक के संदर्भ:कॉन्स्ट अहस्ताक्षरित int

unsigned int i = 2; 
const int &r = i; 
std::cout << r << "\n"; 
i = 100; 
std::cout << r << "\n"; 

पहले प्रिंट बयान 2 देता है मैं उम्मीद के रूप में, लेकिन जब मैं संदर्भित का मूल्य बदल परिवर्तनीय, यह संदर्भ में परिलक्षित नहीं है। दूसरा प्रिंट स्टेटमेंट भी 2 देता है, लेकिन मुझे लगता है कि इसे 100 देना चाहिए?

यदि मैं को में के बजाय परिवर्तनीय i बना देता हूं, तो यह अपेक्षा करता है कि यह अपेक्षा करता है। यहाँ क्या हो रहा है?

Live example

+0

संदर्भ होना नहीं करना चाहिए 'स्थिरांक अहस्ताक्षरित int &r = i;':

अपने डिबगर का उपयोग करके आप तथ्य यह है कि संदर्भ एक पूरी तरह से अलग वस्तु के लिए बात कर रहा है निरीक्षण करने के लिए सक्षम होना चाहिए? –

+0

हां, मुझे लगता है कि यह होना चाहिए, लेकिन मैं जानना चाहता हूं कि यह विशेष स्निपेट इस तरह से क्यों व्यवहार करता है। – KKOrange

+0

... क्या यह अनिर्धारित है? मुझे यह नहीं पता कि यह सच है, अन्य उत्तरों ऐसा लगता है जैसे यह परिभाषित व्यवहार भी है। – KKOrange

उत्तर

33

आप केवल उसी प्रकार के ऑब्जेक्ट का संदर्भ दे सकते हैं।

आपके पास unsigned int के संदर्भ में नहीं हो सकता है।

यहाँ क्या हो रहा है अनिवार्य रूप से, यह है:

const int &r = (int)i; 

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

(gdb) n 
6 const int &r = i; 
(gdb) 
7 std::cout << r << "\n"; 
(gdb) p i 
$1 = 2 
(gdb) p &i 
$2 = (unsigned int *) 0x7fffffffea0c 
(gdb) p &r 
$3 = (const int *) 0x7fffffffe9fc 
(gdb) q 
9

दूसरा प्रिंट बयान भी 2 देता है, लेकिन मुझे लगता है कि 100 देना चाहिए?

क्योंकि अस्थायी int यहां बनाया गया है।

const int &r = i; के लिए, i (unsigned int) पहली बार में int करने के लिए परिवर्तित करने की आवश्यकता है, इसका मतलब है एक अस्थायी int बनाया जाएगा और उसके बाद r करने के लिए बाध्य किया जा (अस्थायी स्थिरांक के संदर्भ lvalue करने के लिए बाध्य किया जा सकता है), यह कोई संबंध नहीं है मूल चर i के साथ और भी।

यदि मैं परिवर्तनीय int के बजाय int int में int बना देता हूं, तो यह अपेक्षा करता है जैसा कि मैं अपेक्षा करता हूं।

क्योंकि कोई रूपांतरण और अस्थायी की आवश्यकता नहीं है, i सीधे r पर बाध्य हो सकता है।

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