2017-04-14 22 views
6

मैं कोडविनाशकारी वस्तु पर निर्माता को ले जाएं?

#include <iostream> 

class A { 
public: 
    A() { 
     std::cout << "Default constructor" << std::endl; 
    } 
    A(const A & other) 
    { 
     std::cout << "Copy constructor" << std::endl; 
    } 
    A(A && other) 
    { 
     std::cout << "Move constructor" << std::endl; 
    } 
    ~A() 
    { 
     std::cout << "Destructor" << std::endl; 
    } 
private: 
    int i; 
}; 

A && f() 
{ 
    return A(); 
} 

int main() { 
    A a = f(); 
} 

मैं इसे चलाने की कोशिश की का एक टुकड़ा है और उत्पादन पता चला है

Default constructor 
Destructor 
Move constructor 
Destructor 

मेरा प्रश्न क्यों है नाशक ले जाया निर्माता से पहले कहा जाता है होना करने के लिए? क्या इसका यह भी अर्थ है कि दूसरी वस्तु को नष्ट मूल्य के साथ बनाया गया था?

+5

आपको अस्थायी चर के संदर्भ (rvalue-) संदर्भ नहीं लौटना चाहिए। – Jarod42

+0

@ फ्रैंकोइस एंड्रीक्स यह उत्तर – Slava

+0

होना चाहिए जीसीसी और वीसी दोनों को डिफ़ॉल्ट रूप से इसके लिए एक कंपाइलर चेतावनी देना चाहिए। किसी भी मामले में, यदि आप उचित चेतावनी स्तर निर्धारित करते हैं तो * * आपको * चेतावनी दे सकता है। –

उत्तर

6

A && f() से स्थानीय चर लौटने पर A & f() जैसी ही समस्या है। वे दोनों संदर्भ हैं। जब तक आप amain() में बनाते हैं, तो स्थानीय चर नष्ट हो गया है। इसके परिणामस्वरूप एक विनाशकारी उदाहरण के संदर्भ में अपरिभाषित व्यवहार होता है।

आप बस मूल्य से लौट main में a को f() से A() ले जाना चाहते हैं। निम्नलिखित का उपयोग करने का प्रयास करें:

A f() { 
    return A(); 
} 
0

पहले A ऑब्जेक्ट f के कॉल स्टैक फ्रेम में बनाया गया था। तो जब fmain पर नियंत्रण लौटाता है तो f के अंदर बनाए गए सभी स्टैक ऑब्जेक्ट्स को नष्ट करना होगा। यही कारण है कि पहले विनाशक को बुलाया गया था।

+2

यह एक कार्यान्वयन-केंद्रित वर्णन है जो होता है। एक भाषा पीओवी से, यहां क्या होता है बस अपरिभाषित व्यवहार है। विवरण के लिए –

+0

@ क्रिस्टियन हैकल धन्यवाद। मैं इसके बारे में कुछ और पढ़ना चाहता हूं। कोई संदर्भ या लिंक? :) –

+0

ठीक है, "सी ++ अपरिभाषित व्यवहार" के लिए एक सरल Google खोज से अधिक नहीं दिखाया जाएगा। हालांकि, http://en.cppreference.com/w/cpp/language/ub एक अच्छी शुरुआत हो सकती है। –

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