2013-09-16 6 views
7

के रूप में एक समारोह के रिटर्न मान पासिंग निम्नलिखित मामले में क्या करना है:संदर्भ

int functionA() { 
    return 25; 
} 

void functionB(const int& ref) { 
    cout << ref << endl; 
} 

void start() { 
    functionB(functionA()); 
} 

जब इस उदाहरण संकलन, यह सही मान 25. आउटपुट कैसे काम करता है? स्टैक पर संदर्भित वापसी मान को हटाया जाना चाहिए (स्टैक से हटाया गया) जब केवल इसका संदर्भ उपयोग करते हैं, या व्यवहार अपरिभाषित है?

+1

अस्थायी वस्तुओं के निरंतर संदर्भों के प्रभाव के लिए सी ++ 11 मानक 12.2/4,5 देखें – nijansen

उत्तर

8

यह "काम" क्योंकि const int& ref की - जब एक संदर्भ const (गारंटी देता है कि आप इसे बदल नहीं करना चाहती) है, संकलक बुला कोड में एक अस्थायी वस्तु (आपके मामले में start) का उत्पादन करेगा, और उसके बाद उस संदर्भ को पास करें।

यदि आप const हटाते हैं तो यह संकलित करने में विफल रहेगा क्योंकि functionA का परिणाम किसी संदर्भ में नहीं बदला जा सकता है।

8

कोई "ढेर पर वापसी मान है" (अकेले एक "ढेर"): functionA एक intमूल्य से लौटता है, तो अभिव्यक्ति functionA() बस प्रकार int की एक अस्थायी मूल्य है। यह मान functionB में निरंतर संदर्भ से जुड़ा हुआ है, और चूंकि इसका जीवनकाल पूर्ण अभिव्यक्ति का है, सबकुछ ठीक है।