2013-11-26 9 views
5

अधिक भार निम्न कोड में:सी ++ nonconst-स्थिरांक संदर्भ समारोह

int foo(const int& f) //version 1 
{ 
    int g = f; 
    return int(foo(g)); // calls itself, turning into SO 
} 

int& foo(int& f) //version 2 
{ 
    f *= -1; 
    return f; 
} 

int main() 
{ 
    int f = 11; 
    cout << foo(f) << endl; 
    cout << foo(22) << endl; 
} 

पहले अदालत प्रिंट -11 की उम्मीद के रूप में; एफ lvalue है, इसलिए यह foo के दूसरे संस्करण से जुड़ा हुआ है (हालांकि यह 1 संस्करण के साथ भी बाध्य हो सकता है, दूसरा संस्करण यह एक बेहतर मैच है)।

foo का दूसरा कॉल पैरामीटर के रूप में एक रैवल्यू का उपयोग कर रहा है, इसलिए foo का एकमात्र व्यवहार्य संस्करण पहला है। अब तक सब ठीक है. foo के पहले संस्करण के अंदर, मैंने पैरामीटर की प्रति बना दी ताकि मैं दूसरे संस्करण को कॉल कर सकूं (lvalue के साथ) और foo के दूसरे संस्करण की कॉल के बाद इसकी एक प्रति वापस कर दें। बात यह है कि यह एक ढेर अतिप्रवाह में बदल जाएगा; अभी भी foo का पहला संस्करण कहा जाएगा।

क्या कोई मुझे बता सकता है कि ऐसा क्यों होता है? पैरामीटर के रूप में पारित होने पर foo के दूसरे संस्करण से जुड़ने के लिए foo के पहले संस्करण के अंदर g की अपेक्षा की जाएगी।

+3

पहले 'foo' को दूसरे' foo' के बारे में कैसे पता चलेगा? –

उत्तर

10

यह वास्तव में सरल है - foo उस बिंदु पर केवल foo(const int& f) है। कोई दूसरी पसंद नहीं है। अभी नहीं। परिभाषाओं को स्विच करें। या उन्हें अलग करें:

int foo(const int& f); 
int& foo(int& f); 

int main() 
{ 
    int f = 11; 
    cout << foo(f) << endl; 
    cout << foo(22) << endl; 
} 


int foo(const int& f) //version 1 
{ 
    int g = f; 
    return int(foo(g)); // calls itself, turning into SO 
} 

int& foo(int& f) //version 2 
{ 
    f *= -1; 
    return f; 
} 
+0

अच्छा, यह आसान था ... – user1019710

2

foo की पहली घोषणा को दूसरे के अस्तित्व के बारे में कोई जानकारी नहीं है। इस प्रयास करें:

int foo(int& f); 
int foo(const int& f) //version 1 
{ 
    int g = f; 
    return int(foo(g)); // calls itself, turning into SO 
} 
1

जब संकलक लाइन तक पहुँच:

return int(foo(g)) 

यह अपने अतिभारित संस्करण 2 के बारे में पता नहीं है फ़ाइल के शीर्ष पर प्रोटोटाइप घोषणाओं जोड़ें:

int foo(const int& f); 
int& foo(int& f); 

इस तरह संकलक संस्करण 2 के अस्तित्व के बारे में जानेंगे और कॉल करने के लिए foo पर काम करते समय इसे विचार कर सकते हैं।

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