2012-12-08 18 views
10

में int संदर्भ और कॉन्स्ट int संदर्भ को char निर्दिष्ट करने के लिए मैंने देखा है कि char को const int& संकलित करने के लिए असाइन करना, लेकिन इसे int& पर असाइन करना एक संकलन त्रुटि देता है।सी ++

char c; 
int& x = c; // this fails to compile 
const int& y = c; // this is ok 

मैं समझता हूँ कि यह ऐसा करने के लिए एक अच्छा अभ्यास नहीं है, लेकिन मैं इसका कारण जानना क्यों ऐसा होता है उत्सुक हूँ।

मैंने "विभिन्न प्रकार के संदर्भ को निर्दिष्ट करने", "एक संदर्भ में चार को असाइन करने", और "कॉन्स्ट संदर्भ और गैर-कॉन्स्ट संदर्भ के बीच अंतर" की तलाश करके एक उत्तर खोजा है, और कई संख्या में आया उपयोगी पोस्ट (int vs const int&, Weird behaviour when assigning a char to a int variable, Convert char to int in C and C++,), लेकिन वे मेरे प्रश्न को संबोधित नहीं कर रहे हैं।

मेरी माफी माँगती है अगर इससे पहले ही इसका उत्तर दिया जा चुका है।

+0

@downvoter क्या आप कारण बताएंगे? मैं सीखना चाहता हूं कि मैं यहां अपने प्रश्नों की गुणवत्ता में सुधार कैसे कर सकता हूं, क्योंकि मैं नियमित रूप से इस साइट पर जाने की योजना बना रहा हूं। :) –

उत्तर

8
int& x = c; 

यहाँ int को char से एक अंतर्निहित रूपांतरण संकलक द्वारा किया जा रहा है। परिणामी अस्थायी int केवल const संदर्भ से जुड़ा हो सकता है। const int& पर बाध्यकारी अस्थायी परिणाम के जीवनकाल को उस संदर्भ के मिलान से भी बढ़ाएगा जो संदर्भ के लिए है।

+0

अच्छी व्याख्या के लिए धन्यवाद। –

3

यह व्यवहार 8.5.3/p5.2 संदर्भ [dcl.init.ref]

5 एक संदर्भ में मानक N4527 में उचित है, टाइप करने के लिए "CV1 T1" एक अभिव्यक्ति द्वारा आरंभ नहीं हो जाता प्रकार की "CV2 टी 2" के रूप में इस प्रकार है: (यानी, CV1 स्थिरांक होगा)

...

5.2 अन्यथा, संदर्भ एक नॉन-वोलाटाइल स्थिरांक प्रकार के लिए एक lvalue संदर्भ होगा, या संदर्भ एक रैल्यू संदर्भ होगा। [उदाहरण:

double& rd2 = 2.0; // error: not an lvalue and reference not const 
int i = 2; 
double& rd3 = i; // error: type mismatch and reference not const 

- अंत उदाहरण]

1

तथ्य यह है कि लाइन

const int& y = c; 

एक अस्थायी बनाता है और y बांधता के लिए अस्थायी का पालन करते हुए सत्यापित किया जा सकता:

#include <iostream> 

int main() 
{ 
    char c = 10; 
    const int& y = c; 

    std::cout << (int)c << std::endl; 
    std::cout << y << std::endl; 

    c = 20; 

    std::cout << (int)c << std::endl; 
    std::cout << y << std::endl; 

    return 0; 
} 

आउटपुट:

10 
10 
20 
10 

y का मान c का मूल्य बदल गया था नहीं बदला।