2017-02-04 5 views
6

§ 3.10.1.5 मानक से के रूप में prvalue भाव परिभाषित करता है:गैर-संदर्भ प्रकारों को वापस करने वाले फ़ंक्शन एक्सप्रेशन क्यों हैं, मानकों के रूप में माना जाता है और xvalues ​​नहीं?

- एक prvalue ("शुद्ध" rvalue) एक rvalue कि एक XValue नहीं है। [उदाहरण: फ़ंक्शन पर कॉल करने का नतीजा जिसका रिटर्न टाइप संदर्भ नहीं है, एक प्रकोप है। 12, 7.3e5, या सत्य जैसे शाब्दिक का मान भी एक प्रसार है। - अंत उदाहरण]

इस प्रकार समारोह foo() एक prvalue अभिव्यक्ति है:

class Foo {}; 
Foo foo() { return Foo{}; } 

प्रारंभ करने के लिए एक lvalue reference to a non-volatile const type/rvalue reference प्रारंभकर्ता अभिव्यक्ति हो गया है (§ 5.2.1.1):

[। ..] एक xvalue (लेकिन थोड़ा सा क्षेत्र नहीं), कक्षा प्रबल, सरणी प्रक्षेपण या कार्य lvalue और "सीवी 1 टी 1" संदर्भ-compat है "CV2 टी 2", या [...]

इस प्रकार

साथ ible,

Foo &&rrFoo_ = foo(); 

मान्य कोड जहां rrFoo_ वस्तु के जीवनकाल (§12.2) का विस्तार एक अस्थायी वस्तु को बांधता है:

कक्षा प्रकार के टेम्पोरर्स विभिन्न संदर्भों में बनाए जाते हैं: एक प्रक्षेपण (8.5.3) के संदर्भ को बाध्यकारी, एक प्रबुद्ध (6.6.3) लौटाते हुए, एक रूपांतरण जो एक प्रावधान बनाता है (4.1, 5.2.9, 5.2 11, 5.4), फेंकना एक अपवाद (15.1), और कुछ प्रारंभिकरण (8.5) में।

जैसा कि ऊपर और RVO उपेक्षा कहा गया है, प्रकार Foo का एक उद्देश्य के निम्नलिखित आरंभ चाल डिफ़ॉल्ट निर्माण वस्तु से एक अस्थायी निर्माण कॉपी कर देंगे। अस्थायी वस्तु जो तब प्रतिलिपि बनाने के लिए उपयोग किया जाएगा अंतिम वस्तु obj_foo नामित निर्माण के लिए कदम:

Foo obj_foo{ foo() }; 
दोनों ही मामलों हम या तो से चोरी या यहाँ तक कि जीवन अस्थायी वस्तु की विस्तार में

तो, जो अन्यथा नष्ट हुआ। (, ताकि उसके संसाधनों से ले जाया जा सकता है, उदाहरण के लिए)

एक XValue (एक "समाप्त हो रहा है" मूल्य) भी आम तौर पर अपने जीवनकाल के अंत के पास, एक वस्तु को दर्शाता है:

§3.10.1.2 के रूप में परिभाषित करता है XValues । [...]

मैं किसी भी मामले के बारे में सोच नहीं सकता जहां एक अस्थायी वस्तु नहीं बनाई गई है। तो मेरा सवाल यह है कि foo() जैसे फ़ंक्शन एक्सप्रेशन क्यों हैं prvalue अभिव्यक्ति माना जाता है कि उन्हें लगता है कि कम से कमxvalues जैसी समान गुण हैं?

+0

आप उपयोगकर्ता द्वारा परिभाषित lvalue और xvalue अभिव्यक्तियां भी लिख सकते हैं: 'int & f();', 'int && g();'। –

उत्तर

2

को देखते हुए int f1() और int && f2(), यह इरादा है कि decltype(f1())int है, और decltype(f2())int && है। जिस तरह से यह काम करने के लिए बनाया जाता है वह यह निर्दिष्ट करता है कि f1() एक प्रावधान है और f2() एक xvalue है। decltype तब यह देखता है कि दी गई अभिव्यक्ति एक प्रबुद्ध, xvalue या lvalue है या नहीं। यदि f1() और f2() दोनों xvalues ​​थे, तो वही भेद अभी भी किसी अन्य तरीके से करने की आवश्यकता होगी।

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

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