c++ - Why is returning a reference to a function local value not a compile error? -


निम्न कोड अनिर्धारित व्यवहार को आह्वान करता है।

  int & amp; Foo () {int बार = 1234; वापसी बार; }   

जी ++ एक चेतावनी जारी करता है:

चेतावनी: स्थानीय चर के संदर्भ: ??? ??? बार ??? लौट आए [-वेटर्न-लोकल-एडीआर]

क्लैंग ++ भी:

चेतावनी: लोकल वेरिएबल 'बार' के साथ जुड़े स्टैक मेमोरी के संदर्भ में वापस आ गया [-

क्यों यह एक संकलन त्रुटि नहीं है ( -error को नजरअंदाज कर रही है?}

एक स्थानीय चर के संदर्भ में क्या मान्य है?

संपादित करें जैसा कि बताया गया है, युक्ति यह सुसंगत है। तो, ऐसा कोड क्यों नहीं रोकता है?

मैं कहूंगा कि यह प्रोग्राम को बनाने की आवश्यकता है दुर्भावनापूर्ण (जो है, यह एक संकलन त्रुटि बनाते हैं) मानक को बहुत कम लाभ के लिए जटिल बनाते हैं। जब आपको ऐसे मामलों का निदान किया जाएगा, तो आपको बिल्कुल सटीक रूप से वर्तनी होगी, और सभी संकलक उन्हें लागू करना होगा।

यदि आप बहुत कम निर्दिष्ट करते हैं, तो यह बहुत उपयोगी नहीं होगा। और कंपाइलर्स शायद पहले से ही चेतावनियों को फेंकने के लिए जांचते हैं, और असली प्रोग्रामर -Wall_you_can_give_me -error के साथ संकलित करते हैं।

यदि आप बहुत अधिक निर्दिष्ट करते हैं, तो यह मुश्किल (या असंभव) मानक को कार्यान्वित करने के लिए कंपाइलर्स के लिए।

इस वर्ग पर विचार करें (जिसके लिए आपके पास केवल शीर्षक और एक लाइब्रेरी है):

  वर्ग फू {int x; सार्वजनिक: इंट एंड amp; getInteger (); };   

और यह कोड:

  int & amp; बार () {फ़ू एफ; वापसी f.getInteger (); }   

अब, क्या यह अयोग्य बनाने या नहीं करने के लिए मानक लिखा जाना चाहिए? शायद नहीं, अगर फ़ू इस तरह कार्यान्वित किया जाता है:

  #include "Foo.h" int global; पूर्णांक में & amp; Foo :: getInteger () {वापसी वैश्विक; }   

एक ही समय में, इसे इस तरह लागू किया जा सकता है:

  #include "Foo.h" int & amp; Foo :: getInteger () {वापसी x; }   

आप निश्चित रूप से एक झूठी संदर्भ दे सकते हैं।

मेरा मुद्दा यह है कि कंपाइलर वास्तव में नहीं जान सकता कि कोई संदर्भ वापस करना ठीक है या नहीं, इसके अलावा एक कुछ तुच्छ मामलों (फ़ंक्शन-स्कोप स्वचालित वैरिएबल या गैर-संदर्भ प्रकार के पैरामीटर के संदर्भ को लौटाते हुए) मुझे नहीं लगता कि इसके लिए मानक को जटिल बनाने के लिए इसके लायक है। विशेष रूप से अधिकांश कंपाइलर पहले से ही गुणवत्ता-कार्यान्वयन के मामले के बारे में चेतावनी देते हैं।

Comments

Popular posts from this blog

Out of index C/C++ -

regex - PatternSyntaxException: while using String.ReplaceAll function in java? -

java - Projects which are accessed via multiple (different) IDEs: Ant or Maven? -