संदर्भ द्वारा तर्क पास करने के दो कारण हैं: (1) प्रदर्शन के लिए (जिस स्थिति में आप संदर्भ द्वारा पास करना चाहते हैं) और (2) क्योंकि आपको फ़ंक्शन के अंदर तर्क के मूल्य को बदलने की क्षमता चाहिए।
मुझे बहुत संदेह है कि आधुनिक आर्किटेक्चर पर एक अहस्ताक्षरित लंबे समय से गुजरना आपको बहुत धीमा कर रहा है। इसलिए मैं मान रहा हूं कि आप State
विधि के अंदर के मूल्य को बदलना चाहते हैं । कंपाइलर शिकायत कर रहा है क्योंकि स्थिरांक 0
को बदला नहीं जा सकता है, क्योंकि यह एक त्रुटि (त्रुटि संदेश में "गैर-लंबू") और विनिमेय ( const
त्रुटि संदेश में) है।
सीधे शब्दों में कहें, तो आप एक ऐसा तरीका चाहते हैं, जो पारित किए गए तर्क को बदल सके, लेकिन डिफ़ॉल्ट रूप से आप एक तर्क को पारित करना चाहते हैं जो बदल नहीं सकता।
इसे दूसरे तरीके से रखने के लिए, गैर- const
संदर्भों को वास्तविक चर का संदर्भ देना होगा। फ़ंक्शन हस्ताक्षर में डिफ़ॉल्ट मान ( 0
) वास्तविक चर नहीं है। आप उसी समस्या में भाग रहे हैं:
struct Foo {
virtual ULONG Write(ULONG& State, bool sequence = true);
};
Foo f;
ULONG s = 5;
f.Write(s); // perfectly OK, because s is a real variable
f.Write(0); // compiler error, 0 is not a real variable
// if the value of 0 were changed in the function,
// I would have no way to refer to the new value
यदि आप वास्तव में State
इस पद्धति के अंदर बदलने का इरादा नहीं रखते हैं , तो आप इसे बदल सकते हैं const ULONG&
। लेकिन आपको इससे बड़ा प्रदर्शन लाभ नहीं मिलने वाला है, इसलिए मैं इसे गैर-संदर्भ में बदलने की सलाह दूंगा ULONG
। मुझे लगता है कि आप पहले से ही एक लौट रहे हैं ULONG
, और मुझे एक संदेह है कि State
किसी भी आवश्यक संशोधनों के बाद इसका मूल्य है । जिस स्थिति में मैं बस विधि को घोषित करूंगा:
// returns value of State
virtual ULONG Write(ULONG State = 0, bool sequence = true);
बेशक, मुझे पूरा यकीन नहीं है कि आप क्या लिख रहे हैं या कहाँ हैं। लेकिन यह एक और समय के लिए एक और सवाल है।