2013-03-28 11 views
7

लौटने के बीच अंतर यदि मैं गलत नहीं हूं, तो मुझे लगता है कि एक कॉन्स संदर्भ और एक रावल्यू संदर्भ दोनों एक रावल्यू से बंध सकते हैं। क्या किसी फ़ंक्शन के बीच कोई व्यावहारिक अंतर है जो पूर्व को लौटाता है और एक फ़ंक्शन जो उत्तरार्द्ध देता है?एक कॉन्स संदर्भ और रैवल्यू संदर्भ

संपादित करें। मैं पूर्व को संशोधित नहीं कर सकता, लेकिन मुझे रावल्यू को संशोधित करने में दिलचस्पी क्यों होगी? क्या इस का कोई मतलब निकलता है?

+0

ठीक है, मैं अनुमान लगा रहा था। मैं पोस्ट संपादित करूंगा ... – jbgs

+2

यदि आप ** ** लौटने के बारे में बात कर रहे हैं तो शायद आप * रावल-रेफरेंस * वापस नहीं करना चाहते हैं। हालांकि कुछ उपयोग मामले हो सकते हैं जिन्हें * रेवल्यू-रेफरेंस * लौटकर कार्यान्वित किया जा सकता है, ज्यादातर स्थितियों में यह अनिर्धारित व्यवहार का कारण बनता है। –

उत्तर

16

const lvalue संदर्भ कुछ भी बांध सकता है। एक रावल्यू संदर्भ केवल गैर-const रावंडों से जुड़ सकता है।

  non-const lvalue const lvalue non-const rvalue const rvalue 
const T& yes    yes   yes    yes 
T&&   no     no    yes    no 

जैसा कि आप देख सकते हैं, वे बहुत अलग हैं।

इसके अतिरिक्त, यदि कोई फ़ंक्शन कॉल एक लवल्यू संदर्भ देता है, तो अभिव्यक्ति एक अंतराल है, लेकिन यदि कोई फ़ंक्शन कॉल ऑब्जेक्ट के लिए रावल्यू संदर्भ देता है, तो अभिव्यक्ति एक xvalue है।

एक समारोह कॉल करता है, तो परिणाम प्रकार एक lvalue संदर्भ प्रकार या समारोह प्रकार के लिए एक rvalue संदर्भ, एक XValue यदि परिणाम प्रकार एक rvalue संदर्भ प्रकार आपत्ति उठाने का है, और एक prvalue अन्यथा एक lvalue है।

जब आप एक रावल्यू को संशोधित करना चाहते हैं - ठीक है, यह वही है जो गतिशील अर्थशास्त्र के बारे में है। पर विचार करें निम्नलिखित समारोह कॉल:

void func(std::string); 

func(std::string("Hello")); 

अभिव्यक्ति std::string("Hello") एक rvalue कि एक अस्थायी वस्तु बनाता है। इस रावल्यू के साथ std::string पैरामीटर को प्रारंभ करते समय, यह उस निर्माता का चयन करेगा जो एक रावल्यू संदर्भ लेता है - कन्स्ट्रक्टर चलाएं। यह कन्स्ट्रक्टर तब रावल्यू से चीजों को चुरा लेता है, जो कि पूरी प्रतिलिपि करने से आम तौर पर बहुत तेज़ होता है। हम इससे चोरी कर सकते हैं क्योंकि हम जानते हैं यह अस्थायी है।

जब आप const lvalue संदर्भ या rvalue संदर्भ लौटना चाहिए का सवाल है:

  • रिटर्निंग एक const lvalue संदर्भ सबसे अधिक इस्तेमाल किया जाता है जब आप एक "आंतरिक" वस्तु को पढ़ने के लिए पहुँच प्रदान करना चाहते है (शायद एक सदस्य एक वर्ग के), लेकिन लोगों को इसे संशोधित करने की अनुमति नहीं है।

  • जब आप कॉलिंग कोड को "आंतरिक" ऑब्जेक्ट (शायद कक्षा के सदस्य) से स्थानांतरित करने की अनुमति देना चाहते हैं तो एक रैल्यू संदर्भ लौटने का सबसे अधिक उपयोग किया जाता है (बिल्कुल सामान्य नहीं)। तो एक अस्थायी लौटे ऑब्जेक्ट से आगे बढ़ने की बजाय (जैसे वे मूल्य से लौटने पर), वे सचमुच आंतरिक वस्तु से आगे बढ़ते हैं।

    यह गैर-const लैवल्यू संदर्भ के साथ भी हासिल किया जा सकता है, लेकिन फिर उन्हें स्पष्ट रूप से std::move करना होगा।

तो यह बहुत संभव है कि आप एक rvalue संदर्भ वापस जाने के लिए की आवश्यकता होगी नहीं है।

नहीं std::forward में वापसी का प्रकार है जो T&& जैसा दिखता है। हालांकि, यह भ्रामक है, क्योंकि यह T के प्रकार के आधार पर एक रावल्यू संदर्भ हो सकता है या नहीं। universal references देखें।

+0

साइड नोट: मैं कहूंगा कि कार्यक्रम के लिए 'कॉन्स' रालुओं का उत्पादन करना बहुत दुर्लभ है। – Angew

+0

धन्यवाद। लेकिन क्या कोई व्यावहारिक मामला है जहां मुझे एक रावल्यू संदर्भ वापस करने की आवश्यकता है? – jbgs

+0

ठीक है, अगर मैं अच्छी तरह से समझता हूं, तो एक रावल्यू संदर्भ लौटने पर यह समझ में आता है कि जब मैं ऑब्जेक्ट को "चोरी" करने के इरादे से किसी अन्य फ़ंक्शन पर यह लौटा संदर्भ भेज रहा हूं। – jbgs

1

क्या एक फ़ंक्शन के बीच कोई व्यावहारिक अंतर है जो पूर्व को लौटाता है और एक फ़ंक्शन जो उत्तरार्द्ध देता है?

प्रश्न खराब गड़बड़ प्रतीत होता है। एक समारोह है कि एक निरंतर lvalue-संदर्भ देता है, केवल पढ़ने के लिए एक वस्तु तक पहुँच प्रदान करता है, जबकि एक समारोह है कि एक rvalue-संदर्भ रिटर्न के लिए पहुँच चलती जिसका मतलब है कि फोन करने वाले की सामग्री को ले जा सकते हैं प्रदान करता है निर्दिष्ट ऑब्जेक्ट और इसे एक अलग ऑब्जेक्ट पर ले जाएं। वे किसी भी माध्यम से तुलनीय नहीं हैं।

दोनों मामलों में, संदर्भों को उस वस्तु को इंगित करना चाहिए जिसका जीवनकाल उस कार्य के अंत से आगे बढ़ता है जो इसे वापस कर रहा है, अन्यथा कॉलर उस संदर्भ का उपयोग करने के लिए अपरिभाषित व्यवहार के साथ यात्रा करेगा।

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