2009-08-27 15 views
20

लौटने संदर्भ मैं इसचेतावनी: के लिए अस्थायी

const string &SomeClass::Foo(int Value) 
{ 
    if (Value < 0 or Value > 10) 
     return ""; 
    else 
     return SomeClass::StaticMember[i]; 
} 

मैं warning: returning reference to temporary मिल की तरह एक समारोह है। ऐसा क्यों है? मैंने सोचा कि दोनों कार्य फ़ंक्शन लौटाते हैं (कॉन्स्ट char * "के संदर्भ में और एक स्थिर सदस्य के संदर्भ में) अस्थायी नहीं हो सकता है।

उत्तर

43

यह एक उदाहरण है जब एक अवांछित निहित रूपांतरण होता है। ""std::string नहीं है, इसलिए संकलक इसे एक में बदलने के लिए एक रास्ता खोजने का प्रयास करता है। और string(const char* str) कन्स्ट्रक्टर का उपयोग करके यह उस प्रयास में सफल होता है। अब std::string का अस्थायी उदाहरण बनाया गया है जो विधि कॉल के अंत में हटा दिया जाएगा। इस प्रकार यह स्पष्ट रूप से एक उदाहरण का संदर्भ देने का एक अच्छा विचार नहीं है जो विधि कॉल के बाद और मौजूद नहीं होगा।

मुझे सुझाव है कि आप या तो वापसी प्रकार को const string पर बदलें या "" किसी सदस्य या SomeClass के स्थिर चर में संग्रहीत करें।

+13

द्वारा एक अच्छा जवाब दें! यहां मुझे लगता है कि सी ++ आजकल प्रोग्रामिंग चुनौतियों के लिए एक अच्छा विकल्प नहीं है। जब आप हाथों में समस्या पर ध्यान केंद्रित करना पसंद करेंगे तो यह आपको अपने आंतरिक कार्यों के बारे में देखभाल करने में समय लगेगा। –

+13

@ लुइस: प्रत्येक भाषा जिसका आप उल्लेख करना चाहते हैं, इन कोने केस गॉथस हैं। –

+1

यह रूपांतरण * है * यहां चाहता था! : पी एक बार जब आप मूल्य से लौटने के लिए बदल जाते हैं, तो कॉन्स भी गिरा दिया जाना चाहिए। –

5

समस्या पहली पंक्ति में है। "" को std::string में बदल दिया जाएगा, क्योंकि इसमें एक वैध निर्माता है जो char* लेता है। वह std::string एक अज्ञात वस्तु होगी, जो अस्थायी है, और आप इसका संदर्भ वापस कर देते हैं।

4

शगी मेंढक की तरह, यह एक अस्थायी std :: स्ट्रिंग ऑब्जेक्ट में परिवर्तित हो जाता है और चूंकि आपकी विधि हस्ताक्षर std :: string & है, तो यह इसके संदर्भ को वापस करने का प्रयास करता है, इसलिए आपको चेतावनी मिलती है। एक वर्कअराउंड std :: स्ट्रिंग को मान द्वारा वापस करने के लिए हो सकता है (const std :: string someClass :: Foo (..))।

6

यह सी ++ में कोड अनुकूलित करने का प्रयास करने का अनुकरणीय है। मैंने यह किया, सभी ने इसे किया ... यह उल्लेखनीय है कि यह शास्त्रीय उदाहरण है जो मूल्य अनुकूलन वापस करने के योग्य है।

टीटीवीडी की तरह कहा गया कि सही उत्तर कॉन्स std :: स्ट्रिंग को वापस करने के लिए है और इसका संदर्भ नहीं है और संकलक इसे अनुकूलित करने दें।

यदि आप अपने पसंदीदा भाषा के दुभाषिया पर भरोसा करते हैं तो आप को अनुकूलित करने के लिए, आपको सी ++ के साथ बहुत स्मार्ट होने की कोशिश नहीं करनी चाहिए।

0

इससे बचने की अन्य संभावना यह है कि आप स्थिर के रूप में वापस लौटना चाहते हैं और संदर्भ

संबंधित मुद्दे