c++ - In which cases does compiler create a new temporary local value while comparing two types? -
टेम्पलेट & lt; typename T & gt; इनलाइन टी const & amp; अधिकतम (टी const & amp; a, T const & amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; एक; & lt; बी? बी ० ए; } इनलाइन चार कॉन्स्ट * अधिकतम (चार कॉन्स्ट * एक, चार कॉन्स्ट * बी) {return std :: strcmp (a, b) & lt; 0? बी ० ए; } टेम्पलेट & lt; typename T & gt; इनलाइन टी const & amp; अधिकतम (टी const & amp; a, टी const & amp; amp; amp; b, टी const & amp; c) {अधिकतम अधिकतम (अधिकतम (ए, बी), सी); } Int main () {const char * s1 = "frederic"; Const char * s2 = "anica"; Const char * s3 = "lucas"; :: अधिकतम (एस 1, एस 2, एस 3); } उपरोक्त कोड के लिए, पुस्तक (सी ++ टेम्पलेट्स- वेस्ले) कहती है:
समस्या यह है कि यदि आप अधिकतम सी (तीन) के लिए कॉल करते हैं -स्ट्रिंग्स, रिटर्न अधिकतम (अधिकतम (ए, बी), सी); एक त्रुटि हो जाती है इसका कारण यह है कि सी-स्ट्रिंग्स के लिए, अधिकतम (ए, बी) एक नया, अस्थायी स्थानीय मान बनाता है जो फ़ंक्शन द्वारा संदर्भ से वापस किया जा सकता है।
अब, मेरा प्रश्न यह है कि मामलों संकलक स्वचालित रूप से बनाता है और अस्थायी चर लौटता है, और क्यों (यह एक भी शामिल है)?
ओह! क्या इसका मतलब यह है कि कंपाइलर प्रत्येक मान को संचय करने के लिए एक अस्थायी चर बनाता है और फिर उन अस्थायी चर को लौटाता है? क्या अन्य मामलों में भी ऐसा किया जाता है?
चलो धीरे धीरे करते हैं:
:: अधिकतम (s1, s2, s3); invokes T const & amp; अधिकतम (टी const & amp; a, T const & amp; amp; amp; b, T const & amp; c) के साथ T जा रहा है चार const * । के भीतर यह विधि हमारे पास है:
अधिकतम (ए, बी) जो चार कॉन्स्ट * अधिकतम (चार कॉन्स्ट * एक, चार कॉन्स्ट * बी) <प्री> अधिकतम (अधिकतम (ए, बी), सी); इस प्रकार चार कॉन्स्ट * अधिकतम (चार कॉन्स्ट * एक, चार कॉन्स्ट * बी) भी और इस प्रकार खतरनाक भाग अगर हम फिर से लिखते हैं):
टेम्पलेट & lt; typename T & gt; टी const & amp; अधिकतम (टी const & amp; a, T const & amp; amp; amp; b, टी const & amp; c) {टी परिणाम = अधिकतम (अधिकतम (ए, बी), सी); वापसी परिणाम; // एक अस्थायी} संदर्भ क्योंकि T है चार कॉन्स्ट * और अधिकतम (चार कॉन्स्ट *, चार कॉन्स्ट जीसीसी समस्या का निदान करने के लिए (देखें): prog.cpp: फ़ंक्शन में "const const & amp; अधिकतम (कॉन्स्ट टी एंड amp; कॉन्स्ट टी एंड एंड कंट टी एंड एंड टी) [टी = कॉन्स्ट चार *] के साथ: प्रोगक्यूपीपीपी: 27: यहां से प्रेगेंट किया गया prog.cpp: 18: चेतावनी: अस्थायी के संदर्भ लौट रहा है < / Code> 18 के साथ रिटर्न अधिकतम (....) टेम्पलेट और 27 होने के नाते यदि आप इस कोड को "छुपा" करने के लिए अधिकतम को दोबारा लिखते हैं: टेम्पलेट & lt; typename T & gt; इनलाइन टी const & amp; अधिकतम (टी const & amp; ए, टी const & amp; amp; amp; amp; बी, टी const & amp; c) {टी const & amp; परिणाम = अधिकतम (अधिकतम (ए, बी), सी); वापसी परिणाम; } आप जीसीसी का पता लगाने (देखें) पड़ेगा, लेकिन इससे समस्या का हल नहीं होता है क्लैग मददपूर्वक चेतावनी देगा कि T const & amp; असली समस्या यह है कि चार कॉन्स्ट * अधिकतम अधिकतम को मानों से वापस करना चाहिए या सभी अधिकतम को संदर्भ संदर्भ ले जाना चाहिए और यदि आप उन्हें मिश्रण करना चाहते हैं तो उन्हें वापस लेना चाहिए।
Comments
Post a Comment