2011-01-18 14 views
12

सी ++ 03 में धारा 12.2.5 कहता है " में एक संदर्भ सदस्य के लिए अस्थायी बाध्य कन्स्ट्रक्टर का सीटीओ-प्रारंभकर्ता (12.6.2) तब तक बना रहता है जब तक कि निर्माता बाहर निकलता है "
तो मैं कार्यक्रम निम्नलिखित की कोशिश कीसीओटर प्रारंभकर्ता सूची में संदर्भित अस्थायी बाध्यकारी

#include<iostream> 
using namespace std; 

struct foo 
{ 
    foo() 
    { 
    cout<<"foo c'tor"<<endl; 
    } 
    ~foo() 
    { 
    cout<<"foo d'tor"<<endl; 
    } 
}; 

struct bar 
{ 
    const foo &ref; 
    bar():ref(foo()) 
    { 
    cout<<"bar c'tor"<<endl; 
    } 

}; 

int main() 
{ 
    bar obj; 
}  

उत्पादन मैं मिलता है:

foo c'tor 
foo d'tor 
bar c'tor 

अब मानक के अनुसार, अस्थायी c'tor आरं में foo() द्वारा उत्पन्न बार के c'tor के बाद बार के c'tor की टी-सूची नष्ट हो जाएगी foo d'tor के बाद मुद्रित किया जाना चाहिए, लेकिन यह दूसरी तरफ है।
कृपया कारण बताएं।

+1

यदि आप निर्माता के अंदर 'रेफरी' का संदर्भ देते हैं तो क्या होता है? हो सकता है कि संकलक निर्णय लेता है कि चूंकि इसका उपयोग वास्तव में नहीं किया जाता है, यह पहले इसे नष्ट कर सकता है। –

+2

वीएस -2008 'foo, bar, foo' आउटपुट का उत्पादन करता है जहां जीसीसी 4.3.4' foo, foo, bar' outputs उत्पन्न करता है। दिलचस्प ... – Naveen

+12

जी ++ बग, रिपोर्ट। –

उत्तर

3

मैं एमएस VS 2010 के साथ इस की कोशिश की है, और यह मेरे देता है उत्पादन भी संकलन के दौरान चेतावनी देता है:

चेतावनी C4413: 'बार :: रेफरी': संदर्भ सदस्य एक अस्थायी कि नहीं करता है 'के लिए आरंभ नहीं हो जाता टी जारी रहती है के बाद निर्माता बाहर निकालता है

foo c'tor 
bar c'tor 
foo d'tor 
Press any key to continue . . . 

ऐसा लगता है कि एमएस VS 2010 विनिर्देश सही ढंग से लागू करता है। मैं मानता हूं कि यह g ++ के लिए एक बग है।

संपादित करें: रेफरी कन्स्ट्रक्टर की प्रारंभिक सूची में प्रारंभ किया जाना चाहिए।

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