Tuesday 15 April 2014

c++ - Const and non-const reference binding -


  शून्य स्वैप (int & a, int & amp; b) {} शून्य प्रति (int & amp; a, const int & amp; बी) {} int main () {int a = 1; अहस्ताक्षरित बी = 2; स्वैप (ए, बी); प्रतिलिपि (ए, बी); }   

सी ++ भाषा, जी + + कंपाइलर।

कृपया मुझे बताएं कि एक कॉपी करें - फ़ंक्शन कॉल, लेकिन स्वैप में कार्य करता है प्रकार के संदर्भ के अमान्य प्रारंभ करें ??? ? पूर्णांक में & amp; एक ???? प्रकार की अभिव्यक्ति से "अहस्ताक्षरित पूर्णांक"

लघु कहानी

> सबसे पहले - नियमों के लिए नियम <कोड> यू की योग्यता के साथ cv2 प्रकार की एक संदर्भ की बाइंडिंग के लिए नियम T योग्यता के साथ < कोड> सीवी 1 ।:

cv1 T का एक संदर्भ प्रकार cv2 U P>

  • यदि संदर्भ एक लावल्यू संदर्भ और प्रारंभिक अभिव्यक्ति है

    • एक लार्वेल और cv1 T है संदर्भ
    • अन्यथा, cv1 होगा const या संदर्भ एक rvalue संदर्भ होगा।

      Cv1 T है संदर्भ-संगत से cv2 U अगर T उसी प्रकार के रूप में U ( या U का आधार है) और यदि cv1 समसा है L cv2 (या अधिक)।

      Unfortunatelly (या सौभाग्य से ?! ;)) एक गैर-निरंतर लावल्यू संदर्भ पैरामीटर के साथ एक फ़ंक्शन को गैर-संदर्भ-संगत प्रकार (या वर्ग प्रकारों के मामले में, पारित तर्क के एक संदर्भ-संगत प्रकार के व्यवहार्य रूपांतरण के बिना) के एक लावलू के साथ नहीं बुलाया जा सकता है।

      विस्तार में

      चलो एक फ़ंक्शन पर विचार करते हैं जो एक पूर्णांक संदर्भ लेता है और एक दूसरा एक पूर्णांक संदर्भ पैरामीटर है।

        शून्य doSomething ( Int & x) {// कुछ रीड & amp; X x = x + 5 के साथ सामान लिखें; } Int doSomethingElse (int const & amp; x) {// कुछ कुछ पढ़ें केवल सामान के साथ x वापसी 3 * x; }   

      चलिए एक हस्ताक्षरित और अन्य अहस्ताक्षरित मान को देखें:

        int a = 1; अहस्ताक्षरित int b = 2;   

      अब हम int नामित a से doSomething () :

        // एक्स के बाद से काम करता है कुछ कुछ करने के लिए बाध्य कर सकते हैं कुछ (ए); // चलो विस्तार / "इनलाइन" का प्रयास करें जो हो रहा है {इंट एंड amp; X = a; X = 5; }   

      कोई जादू नहीं है, संदर्भ x को a से जोड़ता है और 5 (और इसलिए, बहुत) पर सेट है। ठीक है।

      अब हम एक ही समारोह में b उत्तीर्ण करने का प्रयास करते हैं। लेकिन ...

        // ... यह काम नहीं करता है / क्योंकि // अहस्ताक्षरित int int संदर्भित नहीं है int doSomething (b); // यहाँ संकलन त्रुटि // यहाँ क्या हो रहा है {int & amp; X = b; // अहस्ताक्षरित मूल्य एक गैर-कॉन्स्ट लैवल्यू संदर्भ से बाध्य नहीं हो सकता! // संकलन त्रुटि यहाँ x = 5; }   

      यहां हमें परेशानी शुरू हो रही है और doSomething को b के साथ कॉल करना संकलित नहीं होगा।

      आइए देखें Const संदर्भ समारोह अब पासिंग a स्पष्ट रूप से फिर से समस्याग्रस्त नहीं है एक const int संदर्भ एक int मान के लिए बाध्य है।

        int c = doSomethingElse (a); // चलो कुछ भोलेपन फिर से int c; {इंटी कॉन्स्ट एंड amp; X = a; C = 3 * x; }   

      ठीक ठीक लगता है। c हो जाएगा 3 * a

      अब क्या होगा अगर हम उस कोड को b पास करें? मानक कहते हैं, इस मामले में, एक अस्थायी प्रकार cv1 T बनाया गया है और आरंभिक अभिव्यक्ति से प्रतिलिपि प्रारंभिक नियमों का उपयोग करके आरंभ किया गया है।

        int d = doSomethingElse ( ख); // इसमें विस्तार: int d; {Int temp = b; // अन्तर्निहित रूपांतरण, नहीं वास्तव में एक lvalue! इंट कॉन्स & amp; एक्स = अस्थायी; डी = 3 * x; }    

No comments:

Post a Comment