2010-11-26 15 views
9
struct my 
{ 
    my(){ std::cout<<"Default";} 
    my(const my& m){ std::cout<<"Copy";} 
    ~my(){ std::cout<<"Destructor";} 
}; 

int main() 
{ 
    my m(); //1 
    my n(my()); //2 
} 

अपेक्षित उत्पादन:निर्माता मंगलाचरण तंत्र

1) Default 
2) Copy 

वास्तविक उत्पादन:


क्या निर्माता प्रेरक तंत्र की मेरी समझ के साथ गलत क्या है?

Note मैंने ब्रेवटी के लिए हेडर फाइलों को छोड़ दिया है।

उत्तर

11

प्रकरण 1)

m एक समारोह वापसी my और कोई तर्क लेने के रूप में व्याख्या की है। उम्मीद उत्पादन को दूर () अर्थात का उपयोग my m;

केस 2)

देखने के लिए यह कुछ बेहतर "अधिकांश अप्रिय पार्स" के रूप में जाना जाता है।

n एक समारोह लौटने my कि समारोह लौटने my कोई तर्क लेने के लिए प्रकार सूचक का एक तर्क लेता है के रूप में व्याख्या की है।

इस मामले में अपेक्षित आउटपुट my n((my()));

मेरे व्याख्या [पूर्व मामले में एक तर्क विनिर्देश के रूप में इलाज संकलक अब अतिरिक्त () की वजह से अभिव्यक्ति के रूप में यह व्याख्या करने के बजाय] की कोशिश देखने के लिए:

my n((my()))my n = my() के बराबर है। अब rvalue अभिव्यक्ति my() बनाता है एक अस्थायी [अर्थात डिफ़ॉल्ट निर्माता के लिए एक कॉल] और n प्रतिलिपि कि अस्थायी वस्तु को आरंभ नहीं हो जाता [वजह से कॉपी-ctor करने के लिए कोई कॉल कुछ compiler optimization]

पुनश्च: मैं नहीं कर रहा हूँ मेरे उत्तर के अंतिम भाग के बारे में 100% निश्चित है। अगर मैं ग़लत हूं तो मेरी गलती सुझाएं।

+1

इसे आरवीओ नहीं कहा जाता है, लेकिन यह वास्तव में एक आम अनुकूलन है। – MSalters

+3

@MSalters: हाँ, मुझे लगता है कि यह आरवीओ का एक रूप है। :) –

1

प्रसुण की तरह, मुझे संदेह है कि सी ++ कंपाइलर आपके कोड को ऐसे तरीके से पार्स कर रहा है जिसकी आप अपेक्षा नहीं करते हैं। उदाहरण के लिए, मुझे लगता है कि यह एक चर घोषणा के रूप में नहीं लाइन

my m(); 

एक समारोह प्रोटोटाइप घोषणा के रूप में पार्स करने, और निर्माता के लिए कॉल कर रहा है - इसलिए तुम क्यों नहीं उत्पादन को देखते हैं।

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