2015-02-18 10 views
5

मैं एक स्थिति है जहाँ श्रृंखला के लिए सक्षम होने का सामना करना पड़ा एक अस्थायी चर के लिए एक विधि कॉल वास्तव में मददगार होगा:एक संदर्भ अस्थायी चर से मान्य है?

draw(Quad(0, 0, 1, 1).rotate(90)); // <-- .rotate() returns a Quad reference 

struct Quad{ 
    Quad(float x, float y, float width, float height){...} 
    Quad & rotate(float degrees){ 
     ... 
     return *this; 
    } 
} 

हालांकि, मैं अनिश्चित हूँ अगर अस्थायी चर के लिए काफी देर तक जीवित रहेगा draw() इसका उपयोग करने के लिए फ़ंक्शन। क्या यह सुरक्षित है?

+0

http://stackoverflow.com/questions/584824/guaranteed-lifetime-of-temporary-in-c –

उत्तर

12

यह विशेष उपयोग सुरक्षित है। एक अस्थायी पूर्ण अभिव्यक्ति के अंत तक रहता है जो इसे बनाता है; यहां, पूर्ण अभिव्यक्ति संपूर्ण कथन है, जिसमें draw पर कॉल शामिल है।

सामान्य रूप से, यह पैटर्न खतरनाक हो सकता है। निम्नलिखित अपरिभाषित व्यवहार देता है:

Quad & rotated = Quad(0, 0, 1, 1).rotate(90); 
draw(rotated); 

मेरी राय में, मैं इस प्रकार को अपरिवर्तनीय होना पसंद करूंगा; किसी मौजूदा ऑब्जेक्ट को संशोधित करने के लिए फ़ंक्शन को कॉल करने के बजाय, मौजूदा ऑब्जेक्ट को बरकरार रखने के लिए, const फ़ंक्शन को एक नई ऑब्जेक्ट वापस करने के लिए कॉल करें।

† जब तक इसके लिए बाध्य सीधे एक संदर्भ है, जो संदर्भ मिलान करने के लिए अपने जीवनकाल का विस्तार करने के लिए। यह यहां लागू नहीं होता है, क्योंकि यह सीधे बाध्य नहीं है।

+1

का डुप्लिकेट मुझे आपके उत्तर को बेहतर से पसंद है, क्योंकि आप वास्तव में लिखने के बारे में एक ठोस सुझाव देने में कामयाब रहे एक बेहतर वर्ग, कुछ मैं काफी प्रबंधन नहीं कर सका। चलो तुम्हारे साथ जाओ। :) – hvd

+0

मैंने उस परिदृश्य के बारे में नहीं सोचा था, इसे पकड़ने के लिए धन्यवाद! –

+0

मैं सहमत हूं। लेकिन असाइनमेंट ऑपरेटर के साथ सम्मेलन का एक ही पैटर्न नहीं है? यदि यह पैटर्न खतरनाक है, तो क्या इसका मतलब है कि असाइनमेंट ऑपरेटर उसी कारण से खतरनाक हैं? –

6

हां, पूर्ण अभिव्यक्ति के अंत में अस्थायी Quad नष्ट हो गया है (पीछे ;)। तो जब भी आप rotate पर कॉल करते हैं तो यह अभी भी जिंदा है, और जब भी आप पैरामीटर के रूप में draw पर कॉल करते हैं तब भी जीवित रहते हैं।

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