2012-03-12 12 views
5

मैं वर्तमान में अपनी डिग्री शोध प्रबंध लिख रहा हूं और इसमें सी ++ 11 के पीछे सिद्धांत की कुछ व्याख्या भी शामिल है जो वास्तव में ठीक है क्योंकि सी ++ मेरी प्रोग्रामिंग भाषा पसंद है और मानक मुफ्त में (N3337) मुफ्त में उपलब्ध है अपने आप में खो गया।अस्थायी वस्तुओं xvalues ​​हैं?

फिर भी मैंने नई xvalue श्रेणी को सटीक रूप से और विस्तार से समझाने की कोशिश करते समय एक दीवार मारा है। यह मेरी समझ है कि एक अस्थायी वस्तु हमेशा एक xvalue है लेकिन मुझे मानक में इसका कोई संदर्भ नहीं मिल रहा है। यह मेरी समझ है कि फ़ंक्शन की अभिव्यक्ति की मान श्रेणी किसी फ़ंक्शन को कॉल करती है जिसमें गैर-संदर्भ रिटर्न प्रकार होता है, एक xvalue है। मानक कहता है कि "एक xvalue कुछ प्रकार के अभिव्यक्तियों का परिणाम होता है जिसमें रावल-रेफरेंस शामिल होते हैं" जो मुझे परेशान कर रहा है। उदाहरण के लिए:

TestClass { ... }; 
testClass createObject() { return testClass(); } 

void someFunction(TestClass& testClass) { ... } 
void someFunction(TestClass&& testClass) { ... } 

someFunction(createObject()); 

ऊपर होगा, के रूप में उम्मीद, अतिभारित समारोह जो पैरामीटर के रूप में एक rvalue-संदर्भ लेता है कहते हैं। फिर भी createObject() एक रैल्यू-रेफरेंस नहीं लौटाता है, यह टेस्ट क्लास टाइप करने का अस्थायी ऑब्जेक्ट देता है। मेरी समस्या अब है, मुझे इसके पीछे कारणों को समझाना है। अभिव्यक्ति "createObject()" का मूल्यांकन क्या करती है? यदि यह वास्तव में एक xvalue है क्योंकि यह एक अस्थायी वस्तु देता है, तो इसके पीछे तर्क स्पष्ट है और ओवरलोड रिज़ॉल्यूशन के दौरान रावल-रेफरेंस का अनुकूलन किया जाता है। यदि ऐसा नहीं होता है, तो मानक के संबंध में इस व्यवहार के लिए स्पष्टीकरण क्या है? क्या कुछ अंतर्निहित रूपांतरण तर्क कहीं परिभाषित किया गया है जो मुझे अभी तक नहीं मिला है?

मैं वास्तव में सराहना करता हूं अगर कोई इस पर मेरी मदद कर सकता है क्योंकि खुदाई और पढ़ने के दिनों के बाद भी, मुझे अभी तक एक ध्वनि स्पष्टीकरण के साथ आने के लिए तैयार नहीं किया गया है। आपका अग्रिम रूप से बोहोत धन्यवाद।

+0

[संबंधित प्रश्न] (http://stackoverflow.com/questions/6609968/) – fredoverflow

उत्तर

10

ऑब्जेक्ट्स कभी भी {l | r | x} मान नहीं होते हैं। मूल्य श्रेणियों का वर्णन अभिव्यक्ति

XValue समारोह कॉल अभिव्यक्ति (जैसे std::move) जहां समारोह वापसी प्रकार वस्तु के लिए एक rvalue संदर्भ है का मूल्य वर्ग है, और यह भी डाली अभिव्यक्ति के मूल्य वर्ग जहां डाली एक rvalue करने के लिए है ऑब्जेक्ट का संदर्भ (उदाहरण के लिए std::move)।

फ़ंक्शन कॉल अभिव्यक्ति createObject() आपके उदाहरण में prvalue अभिव्यक्ति है क्योंकि यह गैर-संदर्भ रिटर्न प्रकार वाले फ़ंक्शन पर फ़ंक्शन कॉल है।

+0

मुझे पता है कि श्रेणियां केवल अभिव्यक्तियों पर लागू होती हैं। :) क्षमा करें, मैं अपनी पोस्ट में अस्पष्ट था और इसे क्षणिक रूप से सही कर दूंगा। क्या मुझे अब बेवकूफ लगता है - वास्तव में बेवकूफ। मुझे नहीं पता कि मैं एक गैर-संदर्भ रिटर्न प्रकार के साथ एक फ़ंक्शन कॉल की अभिव्यक्ति की अपेक्षा करने के लिए क्या सोच रहा था, एक xvalue होने के लिए। बहुत बहुत धन्यवाद। और मैं बेहतर हो जाता हूं और अब छुपाता हूं ... :( – khaos

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