2011-09-07 12 views
12

को आवंटित मूल्य से वापस लौटा मैं कुछ कोड में एक और बग फिक्स कर रहा था और कुछ कोड में आया जो मैंने सोचा था कि एक बग था; हालांकि, यह कोड जीसीसी 4.4, 4.5, और 4.6 के तहत संकलित करता है और "अपेक्षित" के रूप में कार्य करता है। क्या कोई मुझे बता सकता है कि यह वैध सी ++ है?कॉन्स्ट संदर्भ

struct foo { 
    int bar; 
}; 

foo myfunction(foo const &orig) { 
    foo fooOnStack = orig; 
    fooOnStack.bar *= 100; 
    return fooOnStack; 
} 

void myOtherFunction(foo const &orig) { 
    foo const &retFoo = myfunction(); 
    // perhaps do some tests on retFoo.bar ... 
} 

यदि यह वैध सी ++ है, तो क्या किसी को कानूनी होने के पीछे तर्क पता है?

+3

कैननिकल तर्क यहां उल्लिखित है: [GotW # 88: "सबसे महत्वपूर्ण आधार" के लिए एक उम्मीदवार (http://herbsutter.com/2008/01/01/gotw-88-a-candidate-for- सर्वाधिक महत्वपूर्ण-स्थिरांक /)। – ildjarn

+0

इसके अलावा, मानक सी ++ होने का समर्थन करने वाले मानदंड सी ++ 03 §12.2/5 में हैं। – ildjarn

+0

धन्यवाद, मैंने आज कुछ सी ++ सीखा। यह समझ में आता है, लेकिन मैंने पहले कभी इसका इस्तेमाल नहीं किया था, और पता था कि एक गैर-कॉन्स संदर्भ में लौटने की अनुमति नहीं थी। – graphicsMan

उत्तर

24

हां, यह कानूनी सी ++ है। एक अस्थायी को संदर्भ-से-आधार बनाने के लिए संदर्भ के जीवनकाल में अस्थायी जीवनकाल बढ़ाता है।

-1

मुझे लगता है कि आपको अभी भी सावधान रहना होगा। मेरे पास एक मामला है जहां जी ++ - 4.9 सी ++ 11 के साथ और जटिल ईजिन प्रकार इस का सम्मान नहीं करते हैं (यह लौटा अस्थायी में डेटा हटा देता है, भले ही उसका जीवनकाल बढ़ाया जाना चाहिए)। इसलिए, भले ही यह कानूनी हो, फिर भी इसे डोडी के रूप में चिह्नित किया जाना चाहिए जब तक इसके लिए वास्तव में कोई अच्छा कारण न हो।

इसके अलावा, सी ++ 11 को कॉल साइट पर अस्थायी आवंटित करना चाहिए यदि मूल्य से लौटाया जाता है तो इसकी उपयोगिता शायद उस मानक से कम हो सकती है जब आप नवीनतम मानक का उपयोग कर रहे हों।

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