2017-08-15 15 views
7

उस मामले को ध्यान में रखते हुए जहां कोई कॉपी-एलीशन शामिल नहीं है (पूर्व सी ++ 17)।MyClass obj = MyClass(); क्या 'MyClass()' यहां एक अस्थायी वस्तु का संदर्भ देता है?

cppreference से (फिर से, लगता है सी ++ 14):

  • एक prvalue
  • से एक prvalue लौटने के लिए एक संदर्भ बाध्यकारी:

    अस्थायी वस्तुओं निम्न स्थितियों में बनाए जाते हैं एक समारोह

  • रूपांतरण जो एक प्रावधान बनाता है
  • लैम्ब्डा अभिव्यक्ति
  • कॉपी-आरंभीकरण कि प्रारंभकर्ता
  • सूची-प्रारंभ है कि एक अलग लेकिन परिवर्तनीय प्रकार करने के लिए या एक bitfield के लिए एक std :: initializer_list
  • संदर्भ-प्रारंभ निर्माण के रूपांतरण की आवश्यकता है। BTW मैं इस तरह के हालात में बयान समझ में नहीं आता कि temporaries के अंत में नष्ट कर रहे हैं बाध्यकारी शैली संदर्भ (int &&x = 5; -

सभी पहले एक को छोड़कर मामलों अप्रासंगिक हैं, तो पहले एक मतलब करने के लिए सी ++ लगता है पूर्ण अभिव्यक्ति ..., जिस ऑब्जेक्ट 5 का जिक्र है, वह कथन के अंत में नष्ट नहीं होता है)।

इसलिए, जैसा कि मैंने समझा, एक अस्थायी वस्तु की धारणा में केवल उन लोगों को शामिल किया गया है जिन्हें संग्रहीत करने की गारंटी है (जो संभावित स्थिति के कारण मेरी स्थिति में मामला नहीं है)। क्या मैं सही हूँ? अन्यथा मैं यहां क्या गलत समझ सकता हूं?

BTW वहाँ MyClass() और 4int x = 4; में (या int x = 2 + 2; में 2 + 2) के बीच कोई अंतर है? शायद मैं गलत हूं और पहला व्यक्ति एक अस्थायी वस्तु का संदर्भ देता है जबकि अन्य दो नहीं ...

+1

यह "रूपांतरण है कि एक prvalue बनाता है" मामले के तहत गिना जाता है नहीं करना चाहिए। (हाँ, यह एक रूपांतरण की तरह नहीं दिखता है, लेकिन मानक समूह 'टी()', 'टी (1)', और 'टी (1,2) 'एक साथ।) –

+0

@ टी.सी. तो क्या ऐसी चीज केवल 'MyClass()' मामले के लिए अस्थायी है? एक उदाहरण के रूप में प्रस्तावित '4' के लिए नहीं? तो इस तरह के अंतर के लिए तर्क क्या है? हो सकता है कि आप एक उत्तर बना सकें? .. आपको लगता है कि आप पहले से मौजूद एक विरोधाभास को मानते हैं .. – ledonter

+0

क्या 4 अभी भी "रूपांतरण जो एक प्रावधान बनाता है" द्वारा कवर नहीं किया जाएगा? इस मामले में यह पूर्णांक पूर्णांक से, एक अभिन्न पूर्णांक में रूपांतरण है। –

उत्तर

1

सी ++ 14 मानक [1] 12.2 में अस्थायी वस्तुओं ([वर्ग। समकालीन]):

वर्ग प्रकार के temporaries विभिन्न संदर्भों में बनाई गई हैं: एक prvalue ([...]) के लिए एक संदर्भ बंधन, लौटने एक prvalue ([...]), एक रूपांतरण है कि एक prvalue बनाता है ([...], 5.4), अपवाद फेंकना ([...]), और कुछ प्रारंभिकरणों में ([...])।

MyClass obj = MyClass(); में, MyClass() कार्यात्मक अंकन में एक स्पष्ट प्रकार रूपांतरण है, इसलिए यह एक अस्थायी वस्तु है, क्योंकि यह "रूपांतरण है कि एक prvalue बनाता है" के अंतर्गत आती है।

यह 4int x = 4; में लागू नहीं होता है क्योंकि नियम "वर्ग प्रकार" को संदर्भित करता है लेकिन int एक "मौलिक प्रकार" है।

इसके अतिरिक्त 8.5 initializers ([dcl.init]) खंड (17.8) में गैर-वर्ग प्रकार initializers के शब्दों को परिभाषित करता है के रूप में

अन्यथा, वस्तु का प्रारंभिक मूल्य प्रारंभ किया जा रहा है (संभवतः परिवर्तित है) प्रारंभकर्ता अभिव्यक्ति का मान। [...]

जबकि कक्षा प्रकारों के लिए, (प्रतिलिपि) रचनाकारों का आह्वान किया जाता है। तो आपको वर्ग प्रकारों के लिए कॉपी करने के लिए एक (अस्थायी) ऑब्जेक्ट की आवश्यकता है, लेकिन "अन्य" प्रकारों के लिए नहीं।

[1]: वास्तव में N4296, लेकिन यह एक अंतर

+0

शायद आप जानते हैं कि आपके द्वारा उद्धृत किए गए टुकड़े से संभावित रूप से परिवर्तित_ के मामले में, 'फ्लोट x = 4;' (रूपांतरण को फ़्लोट करने के लिए int), क्या 4 की मूल int के लिए एक अस्थायी वस्तु है? और रूपांतरण का नतीजा एक 'एक्स' से अलग वस्तु को संदर्भित करता है? यह सुनिश्चित नहीं है कि यह उस मामले में कैसे काम करता है .. – ledonter

+0

कोई अस्थायी वस्तु नहीं है, क्योंकि प्रक्षेपण '4' सीधे '4.f' के रूप में परिवर्तित किया जाता है जिसे निर्दिष्ट किया जाता है। इसलिए 'int' प्रकार की वस्तु की आवश्यकता नहीं है, केवल एक मान है, इसलिए कोई अस्थायी वस्तु नहीं बनाई जानी चाहिए। रूपांतरण का परिणाम फिर से एक प्रसार है, यह एक वस्तु नहीं है, इसलिए यह '4' के समान वस्तु नहीं हो सकता है। –

+0

क्या मैं पूछ सकता हूं कि [N4296] (https://wg21.link/n4296) कहां है 'MyClass() 'एक स्पष्ट प्रकार रूपांतरण है? ऐसा नहीं लगता था। (जैसा ऊपर बताया गया है, यह रूपांतरण के बजाए एक निर्माता की तरह लगता है) – Bigman

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