ए 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 देखें।
स्रोत
2013-03-28 12:23:44
ठीक है, मैं अनुमान लगा रहा था। मैं पोस्ट संपादित करूंगा ... – jbgs
यदि आप ** ** लौटने के बारे में बात कर रहे हैं तो शायद आप * रावल-रेफरेंस * वापस नहीं करना चाहते हैं। हालांकि कुछ उपयोग मामले हो सकते हैं जिन्हें * रेवल्यू-रेफरेंस * लौटकर कार्यान्वित किया जा सकता है, ज्यादातर स्थितियों में यह अनिर्धारित व्यवहार का कारण बनता है। –