§ 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
जैसी समान गुण हैं?
आप उपयोगकर्ता द्वारा परिभाषित lvalue और xvalue अभिव्यक्तियां भी लिख सकते हैं: 'int & f();', 'int && g();'। –