आप उलझन में प्रतीत होते हैं कि एक रेवल्यू संदर्भ क्या है और यह अर्थशास्त्र को स्थानांतरित करने से कैसे संबंधित है।
पहली बात यह है कि: &&
का मतलब स्थानांतरित नहीं है। यह एक विशेष संदर्भ प्रकार से अधिक कुछ नहीं है। यह है अभी भी एक संदर्भ।यह एक मूल्य नहीं है; यह मान नहीं है; यह एक मूल्य के लिए संदर्भ है। जिसका अर्थ है कि इसमें संदर्भ प्रकार की सभी सीमाएं हैं। विशेष रूप से, यह उस मान को संदर्भित करना चाहिए जो अभी भी मौजूद है। तो एक लटकती आर-वैल्यू संदर्भ लौटना एक लापरवाही एल-वैल्यू संदर्भ लौटने से बेहतर नहीं है।
"मूविंग" एक ऑब्जेक्ट दावा किसी अन्य ऑब्जेक्ट की सामग्री के स्वामित्व का दावा करने की प्रक्रिया है। आर-मान संदर्भ स्थानांतरित करें अर्थशास्त्र को स्थानांतरित करें, लेकिन केवल &&
होने का अर्थ यह नहीं है कि कुछ भी स्थानांतरित हो गया है। आंदोलन केवल तब होता है जब एक चालक कन्स्ट्रक्टर (या असाइनमेंट ऑपरेटर ले जाएं) कहा जाता है; जब तक कि उन दो चीजों में से एक नहीं कहा जाता है, कोई आंदोलन नहीं हुआ है।
आप उपयोगकर्ता के लिए अपने कार्य से बाहर एक std::vector
की सामग्री को स्थानांतरित करना चाहते हैं, तो आप बस ऐसा करते हैं:
std::vector<int> myvec = fill_list();
दो में से एक:
std::vector<int> fill_list() {
std::vector<int> res;
... do something to fill res ...
return res;
}
fill_list()
के इस प्रयोग को देखते हुए चीजें घटित होंगी या तो वापसी को समाप्त किया जाएगा, जिसका मतलब है कि कोई प्रतिलिपि या चलती है। res
सीधे myvec
में बनाया गया है। या res
को वापसी मूल्य में स्थानांतरित किया जाएगा, जो तब myvec
की चाल-प्रारंभिकता करेगा। तो फिर, कोई प्रतिलिपि नहीं।
, तो आप इस था:
std::vector<int> myvec;
myvec = fill_list();
फिर, यह में चले गए होंगे। कोई प्रतिलिपि नहीं
सी ++ 11 जानता है कि चीजों को स्पष्ट रूप से स्थानांतरित करना सुरक्षित है। संदर्भ या कुछ के बजाय मूल्य से मूल्य लौटाना हमेशा स्थानांतरित करने के लिए एक सुरक्षित समय है। इसलिए, यह चलेगा।
स्रोत
2012-03-28 20:01:52
भले ही यह संकलित हो, फिर भी यह एक खतरनाक संदर्भ लौटाएगा। _Why_ क्या आप एक रावल्यू संदर्भ वापस करना चाहते हैं? आप मूल्य से वापस क्यों नहीं आते? – ildjarn
जहां तक मुझे पता है कि यह एक खतरनाक संदर्भ नहीं होगा, यह सी ++ 11 में चलती शब्दावली का पूरा बिंदु है, कम से कम मुझे दस्तावेज से मिलता है। – Sambatyon
मुझे लगता है कि आपको रावल संदर्भों के बारे में उस बिंदु को गलत मिला है: यह है कि _value_ जिसे नष्ट किया जाएगा, उसे कॉपी करने की आवश्यकता के बजाय इसे स्थानांतरित किया जा सकता है।यदि आप सीधे एक रावल्यू संदर्भ वापस करते हैं, तो _is_ कोई मूल्य नहीं है क्योंकि इसे नष्ट कर दिया गया है _before_ आपको इसकी सामग्री को स्थानांतरित करने का मौका मिला है। – leftaroundabout