फ़ंक्शन से बचने के लिए scope
पैरामीटर के लिए यह कानूनी नहीं है। कंपाइलर को यह गारंटी देना चाहिए कि उस डेटा के कोई संदर्भ फ़ंक्शन से बचें। इसका मुख्य रूप से प्रतिनिधियों के साथ उपयोग किया जाता है, क्योंकि यह संकलक को बंद करने से बचने की अनुमति देता है, क्योंकि यह जानता है कि प्रतिनिधि भाग नहीं पाएगा।
const ref
const
है - बस in
की तरह होगा - लेकिन परिवर्तनीय प्रतिलिपि के बजाय संदर्भ द्वारा पारित किया गया है, इसलिए आप एक प्रति से बचें। हालांकि, सी ++const ref
के विपरीत रैल्यू के साथ काम करता है। यह एक लवली दिया जाना चाहिए। इसलिए, यदि आप const ref
होने के लिए पैरामीटर घोषित करते हैं, तो यह उसमें सीमित होगा जो आप इसे पारित कर सकते हैं। आपको आमतौर पर इसे पास करने के लिए एक चर घोषित करना होगा, जबकि in
एक अस्थायी स्वीकार करेगा।
void func(const ref int var) {}
int a;
func(a); //legal
func(7); //illegal
उन कॉल के दोनों अगर func
const
या in
ले लिया कानूनी होगा। इसलिए, सामान्य रूप से, सवाल यह नहीं है कि आपको const ref
या in
का उपयोग करना चाहिए या नहीं। सवाल यह है कि आपको const
या in
का उपयोग करना चाहिए। और उस स्थिति में, सवाल यह है कि क्या आप scope
का उपयोग करना चाहते हैं या नहीं, क्योंकि वे const
दोनों हैं। और तुम scope
उपयोग करें यदि आप यह सुनिश्चित करें कि चर के लिए कोई संदर्भ है कि आप में से गुजरती हैं कि समारोह बच जाएंगे चाहते हैं, तो यह आम तौर पर केवल प्रतिनिधियों के साथ प्रयोग किया जाता है लेकिन वर्ग या सरणियों के साथ उपयोगी हो सकता है।
हालांकि, pure
एक समारोह पर गारंटी देता है कि अपने तर्कों में से किसी का कोई सन्दर्भ वापसी मान (के बाद से pure
कार्यों केवल वैश्विक चर का उपयोग कर सकते हैं यदि वे अडिग रहे हैं या कर रहे हैं मूल्य प्रकार और स्थिरांक हैं) के माध्यम से छोड़कर भागने, तो कर सकते हैं pure
आमतौर पर आपको वह सब कुछ देता है जो आपको कक्षाओं और सरणी के पैरामीटर के लिए आवश्यक है। इसके अतिरिक्त, यदि रिटर्न प्रकार एक वर्ग या सरणी है, तो आप सामान्य इसे बनाना नहीं चाहते हैं ताकि तर्क बच सकें, क्योंकि फिर वापसी मूल्य में उन तर्कों से कुछ भी पुन: उपयोग करने में सक्षम होने के बजाय, फ़ंक्शन एक प्रतिलिपि बनाने के लिए मजबूर किया जाता है, जो आम तौर पर कम कुशल होता है।
तो, scope
आम तौर पर केवल प्रतिनिधियों के साथ उपयोग की है, लेकिन इस अवसर पर वर्ग या सरणियों के साथ उपयोगी है। यह पहले से ही आम तौर पर कार्यों के लिए pure
होने के लिए बेहतर है, ताकि अधिकांश मुद्दों का ख्याल रखा जा सके। जैसे, जबकि यह in
उपयोग करने के लिए चोट नहीं करता है, वहां अक्सर in
बजाय const
का उपयोग करने में थोड़ा बात है। और आप आम तौर पर केवल const ref
का उपयोग करते हैं यदि आप वास्तव में पारित होने वाले चर की प्रतिलिपि से बचना चाहते हैं, क्योंकि अन्यथा आप केवल उस फ़ंक्शन को अंतराल पास कर सकते हैं। आप एक समारोह को ओवरलोड कर सकते हैं यह संस्करण है जो const
और एक जो const ref
लेता है, लेकिन है कि स्पष्ट रूप से, कोड दोहराव में परिणाम है तो जब तक आप वास्तव में चाहते हैं const ref
, यह शायद सिर्फ सबसे अच्छा const
उपयोग करने के लिए ले जाता है है ऐसा है कि।
संपादित करें: बीमार की सलाह दी
scope
अभी तक प्रतिनिधियों के अलावा और कुछ (2013-06-18) के रूप में के लिए लागू किया जाना है, ताकि प्रतिनिधियों के अलावा और कुछ के साथ या तो scope
या in
उपयोग कर रहा है। फिलहाल, वे भ्रामक हैं, और यदि/एक बार scope
प्रतिनिधियों के अलावा और कुछ के लिए लागू किया गया है, वहाँ एक उच्च जोखिम है कि अपने कोड चर scope
या in
बचने के साथ चिह्नित के लिए संदर्भ की वजह से टूट जाएगा है।
स्रोत
2011-12-15 21:05:24
1. अच्छा, कि बताता है कि क्यों मैं प्रभाव पुन: पेश करने में सक्षम नहीं था। 2. तो, क्या आप कह रहे हैं कि यदि किसी फ़ंक्शन के पैरामीटर में 'स्टोरेज क्लास' है, तो इसकी प्रतिलिपि बनाई जाती है? क्या मुझे 'कॉन्स्ट रेफरी' का उपयोग करना चाहिए? – Arlen
वर्तमान कंपाइलर चयन के साथ, डीएमडी पर आधारित सभी, इसकी प्रतिलिपि बनाई जाती है। लेकिन इसके बारे में साफ बात यह है कि यह अभी भी तकनीकी रूप से कार्यान्वित किया गया है क्योंकि उपयोगकर्ता अंतर नहीं बता सकता है। डीएमडी के अनुकूलन के लिए इसका लाभ उठाने के लिए, इसे पहले 'स्कोप' को पूरी तरह कार्यान्वित करने की आवश्यकता है। यदि आपने प्रतिलिपि को एक बाधा के रूप में पहचाना है और आप अनुकूलित करना चाहते हैं, तो 'कॉन्स्ट रेफ' का उपयोग करना एक अच्छा विचार है। –
आप डीएमडी के बारे में इतना कैसे जानते हैं? क्या आप कोर-देवों में से एक हैं? – Arlen