2016-07-07 16 views
6

मेरी समझ के अनुसार, एक अस्थायी वस्तु उत्पन्न होने पर चालक कन्स्ट्रक्टर को बुलाया जाएगा। यहाँ getA() समारोह एक अस्थायी वस्तु लौटा रहा है, लेकिन मेरे कार्यक्रम चाल निर्माता से संदेश मुद्रण नहीं है:चालक कन्स्ट्रक्टर क्यों नहीं कहा जाता है?

#include <iostream> 

using namespace std; 

class A 
{ 
    public: 
    A() 
    { 
     cout<<"Hi from default\n"; 
    } 

    A(A && obj) 
    { 
     cout<<"Hi from move\n"; 
    } 
}; 

A getA() 
{ 
    A obj; 
    cout<<"from getA\n"; 
    return obj; 
} 

int main() 
{ 
    A b(getA()); 

    return 0; 
} 
+0

मैं चालक के साथ खोज रहा था और Google मुझे उस पृष्ठ पर नहीं ले जा रहा है –

उत्तर

6

संकलक उदाहरण obj बाहर का अनुकूलन और एक के बिना फोन करने वाले के लिए सीधे वापस वस्तु भेज सकता है, वैचारिक मूल्य प्रतिलिपि लिया जा रहा है।

इसे नाम दिया गया है वापसी मूल्य अनुकूलन (एनआरवीओ)। यह क्लासिकल रिटर्न वैल्यू ऑप्टिमाइज़ेशन (आरवीओ) की तुलना में अधिक आक्रामक अनुकूलन है कि एक कंपाइलर अज्ञात अस्थायी की मान प्रति को कम करने के लिए आमंत्रित कर सकता है।

संदेह से बचने के लिए संकलक कर सकता है भले ही ऐसा करने में साइड-इफेक्ट है (आपके मामले में कंसोल आउटपुट की कमी)।

+0

डुप्ली लक्ष्य के साथ क्या गलत था? – NathanOliver

+0

आरवीओ (अधिक हालिया) एनआरवीओ के साथ ऐसा करना अधिक था। आईएमएचओ एक डुप्लिकेट केवल एक अच्छा है अगर यह काफी सटीक है। – Bathsheba

+0

उत्तर में से आधे ने एनआरवीओ के बारे में बात की और उदाहरण के बारे में बात की। – NathanOliver

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