c++ - Reference-type conversion operators: asking for trouble? -


जब मैं जी ++

  वर्ग का उपयोग कर निम्न कोड को संकलित करता हूं ए {}; शून्य foo (ए और) {} इंट मुख्य () {एफू (ए ()); वापसी 0; }  

मुझे निम्न त्रुटि संदेश मिलते हैं:

  & gt; जी ++ test.cpp -o test test.cpp: फ़ंक्शन 'int main ()' में: test.cpp: 10: त्रुटि: अस्थायी प्रकार 'ए' परीक्षा से टाइप 'ए एंड' के गैर-कॉन्फ्रेंस संदर्भ के अवैध प्रारंभ .cpp: 6: त्रुटि: 'void foo (a & amp;)' का तर्क 1 गुजराने में कुछ प्रतिबिंब के बाद, ये त्रुटियां मेरे लिए काफी समझदारी होती हैं I  ए ()  एक अस्थायी मान है, स्टैक पर असाइन करने योग्य स्थान नहीं है, इसलिए इसमें कोई पता नहीं होगा यदि इसका कोई पता नहीं है, तो मैं इसके संदर्भ में नहीं रख सकता। ठीक है, ठीक है। 

लेकिन रुको! अगर मैं निम्नलिखित रूपांतरण ऑपरेटर को वर्ग

  वर्ग ए {सार्वजनिक: ऑपरेटर ए & amp; }};  

तब सब ठीक है! मेरा सवाल यह है कि क्या यह भी दूर से सुरक्षित है। क्या यह बिंदु है जब ए () को एक अस्थायी मान के रूप में बनाया गया है?

मुझे इस तथ्य से कुछ विश्वास दिया गया है कि

<पूर्व> void foo (const A & amp;) {}

जी ++ के अनुसार अस्थायी मान स्वीकार कर सकता है और मैंने उपयोग किए गए सभी अन्य कंपाइलर्स const कीवर्ड को हमेशा दूर किया जा सकता है, इसलिए यह मुझे आश्चर्यचकित करता है अगर const a & amp; पैरामीटर और A & amp; पैरामीटर तो मुझे लगता है कि मेरे प्रश्न पूछने का एक और तरीका है: एक const एक अस्थायी मूल्य का संदर्भ क्यों संकलक द्वारा सुरक्षित माना जाता है जबकि एक गैर- const संदर्भ नहीं है

ऐसा नहीं है कि कोई पता नहीं लिया जा सकता है (संकलक हमेशा उसे स्टैक पर shoved कर सकता है , जो इसे रिफ-टू-कॉन्स्ट के साथ करता है), यह प्रोग्रामर्स इन्टेंट का प्रश्न है। एक इंटरफ़ेस के साथ जो एक ए और, यह कह रहा है "मैं इस पैरामीटर में क्या संशोधित करूंगा ताकि आप फ़ंक्शन कॉल के बाद पढ़ सकें"। यदि आप इसे अस्थायी पास करते हैं, तो उस चीज़ को "संशोधित किया गया" समारोह के बाद मौजूद नहीं है। यह (शायद) एक प्रोग्रामिंग त्रुटि है, इसलिए इसे अस्वीकार कर दिया है। उदाहरण के लिए, विचार करें:

  शून्य से प्लस_ऑन (इंट और एक्स) {++ x; } Int main () {int x = 2; फ्लोट एफ = 10.0; plus_one (x); plus_one (च); Cout & lt; & lt; एक्स एंड एलटी; & lt; एंडएल & lt; & lt; एफ एंड एलटी; & lt; endl; }  

यह संकलन नहीं करता है, लेकिन अगर अस्थायी किसी रिफ-टू-गैर-कॉन्स्ट से जुड़ सकते हैं, तो यह संकलन करेगा लेकिन आश्चर्यजनक परिणाम होंगे। प्लस_ऑन (एफ) में, च परस्पर रूप से एक अस्थायी अंतर में परिवर्तित हो जाएगा, प्लस_ऑन अस्थायी रूप से ले जाएगा और इसे बढ़ाना होगा, जिससे अंतर्निहित फ्लोट च को अछूता नहीं छोड़ेगा। जब प्लस_ऑन वापस आया, तो इसका कोई प्रभाव नहीं होता। यह लगभग निश्चित रूप से नहीं है कि प्रोग्रामर क्या चाहता था।


नियम कभी-कभी गड़बड़ करता है एक सामान्य उदाहरण (वर्णित), एक फाइल खोलने, कुछ प्रिंट करने और इसे बंद करने का प्रयास कर रहा है आप ऐसा करने में सक्षम होना चाहते हैं:

  ऑफस्ट्रीम ("बार") & lt; & lt; "Flah";  

लेकिन आप ऐसा नहीं कर सकते क्योंकि ऑपरेटर & lt; & lt; रिफ-टू-गैर-कॉन्स्ट लेता है आपके विकल्प इसे दो पंक्तियों में तोड़ देते हैं, या एक रेफरी टू-गैर-कॉस्ट:

  ऑफस्ट्रीम ("बारटा") लौटने वाली विधि को बुलाते हैं। फ्लश () & lt; & lt; "Flah";  

Comments

Popular posts from this blog

c++ - Linux and clipboard -

Visual Studio 2005: How to speed up builds when a VSMDI is open? -

booting ubuntu from usb using virtualbox -