जब मैं g++
संदर्भ-प्रकार रूपांतरण ऑपरेटर: परेशानी के लिए पूछ रहे हैं?
class A {};
void foo(A&) {}
int main()
{
foo(A());
return 0;
}
> g++ test.cpp -o test
test.cpp: In function ‘int main()’:
test.cpp:10: error: invalid initialization of non-const reference of type ‘A&’ from a temporary of type ‘A’
test.cpp:6: error: in passing argument 1 of ‘void foo(A&)’
> g++ test.cpp -o test
test.cpp: In function ‘int main()’:
test.cpp:10: error: invalid initialization of non-const reference of type ‘A&’ from a temporary of type ‘A’
test.cpp:6: error: in passing argument 1 of ‘void foo(A&)’
> g++ test.cpp -o test
test.cpp: In function ‘int main()’:
test.cpp:10: error: invalid initialization of non-const reference of type ‘A&’ from a temporary of type ‘A’
test.cpp:6: error: in passing argument 1 of ‘void foo(A&)’
कुछ प्रतिबिंब के बाद निम्न त्रुटियों को संकलित करता हूं, तो ये त्रुटियां मुझे बहुत समझ में आती हैं। A()
केवल एक अस्थायी मान है, न कि स्टैक पर एक असाइन करने योग्य स्थान, इसलिए ऐसा कोई प्रतीत नहीं होता है। यदि उसके पास कोई पता नहीं है, तो मैं इसका संदर्भ नहीं रख सकता। अच्छा ठीक है।
लेकिन प्रतीक्षा करें! यदि मैं निम्न xxx47
class A
{
public:
operator A&() { return *this; }
};
में निम्न रूपांतरण ऑपरेटर जोड़ता हूं तो सब ठीक है! मेरा सवाल यह है कि क्या यह भी दूरस्थ रूप से सुरक्षित है। Xzx48 क्या इंगित करता है जब A()
एक अस्थायी मान के रूप में बनाया गया है?
मुझे इस तथ्य से कुछ विश्वास दिलाया गया है कि
void foo(const A&) {}
g++
और अन्य सभी कंपाइलर्स के अनुसार अस्थायी मूल्यों को स्वीकार कर सकता है। Xzx51 कीवर्ड हमेशा काटा जा सकता है, इसलिए यह मुझे आश्चर्यचकित करेगा यदि const A&
पैरामीटर और A&
पैरामीटर के बीच कोई वास्तविक अर्थपूर्ण अंतर था। तो मुझे लगता है कि यह मेरा प्रश्न पूछने का एक और तरीका है: const
एक अस्थायी मूल्य का संदर्भ क्यों है जिसे संकलक द्वारा सुरक्षित माना जाता है जबकि एक गैर- const
संदर्भ नहीं है?
मैं मानता हूं कि इस तरह की चीज आमतौर पर प्रोग्रामर त्रुटि होती है। यदि आप उत्सुक हैं, तो कक्षा जिसे मैं संदर्भ के रूप में पास करने की कोशिश कर रहा हूं वह एक प्रकार का स्मार्ट सूचक है, जिसमें अंतर्निहित ढेर-आवंटित सूचक सदस्य हैं। मैं वास्तव में प्राप्त करने वाले फ़ंक्शन को अंतर्निहित सूचक के साथ काम करना चाहता हूं। मैं सिर्फ यह सुनिश्चित करना चाहता हूं कि प्राप्त करने वाले फ़ंक्शन रिटर्न के बाद अस्थायी स्मार्ट पॉइंटर नष्ट नहीं होता है (संदर्भ गणना में कमी)। – Ben
यदि आपका इरादा है, तो या तो स्टैक पर स्मार्ट पॉइंटर स्पष्ट रूप से घोषित करें और इसे पास करें या इसे मूल्य में पास करें। यदि आप इसे मूल्य में पास करते हैं तो आपको गारंटी दी जाती है कि जब तक कार्य समाप्त नहीं हो जाता तब तक इसे नष्ट नहीं किया जाएगा। – MSN
@बेन - इसके बारे में मेरे पोस्ट में कुछ जोड़ा। यह नहीं कह सकता कि क्या यह आपके कोड को देखे बिना आपके लिए एक अच्छा विचार है, लेकिन कुछ उपयोग के मामले हैं (और यह तब तक नष्ट नहीं होगा जब तक यह वापस नहीं आ जाता) –