पर लौटने वाले संदर्भ का कंपाइलर पता लगाने के बाद मुझे स्थानीय चर के संदर्भ को वापस करने के कारण एक बुरा अपरिभाषित व्यवहार से काटा गया है।स्थानीय चर
हम जानते हैं कि यह बुरा है, और आम तौर पर संकलक हमें यह बताने के लिए एक अच्छा warning
प्रिंट करता है ... अच्छी तरह से gcc (3.4.2) चेक को बहुत दूर धक्का नहीं लग रहा है।
std::string get_env_value(std::string const& key);
std::string const& get_phase()
{
std::string const& phase = get_env_value("PHASE"); // [1]
std::cout << "get_phase - " << phase << '\n';
return phase; // [2]
}
यह एक गड़बड़ बिना संकलित, और अभी तक हम अपरिभाषित व्यवहार का बुरा दायरे में आते हैं।
रेखा [1]
ठीक है क्योंकि मानक निर्दिष्ट करता है कि एक कॉन्स संदर्भ के लिए एक परिवर्तनीय बाध्यता का जीवनकाल को संदर्भ संदर्भ के जीवनकाल से मेल खाने के लिए बढ़ाया जाना चाहिए।
लाइन [2]
ठीक भी लगती है ...
- सी ++ विनिर्देशों इस मामले शामिल हैं?
- क्या किसी को पता है कि यह आमतौर पर निदान किया जाता है? (मैं एक झंडा या कुछ छूट भी सकते हैं ...)
ऐसा नहीं है कि स्थिर विश्लेषण बताने के लिए कि [1]
के लिए एक "जीवन एक्सटेंशन" का उपयोग होने में सक्षम होना चाहिए मुझे लगता है, [2]
सुरक्षित नहीं है, लेकिन यह हो सकता है बदसूरत तेजी से मुझे लगता है ...
अरे, यह एक बुरा मामला है! –
आखिरकार यह संभव है कि 'get_env_value()' एक चर के संदर्भ को वापस कर रहा है जो दायरे से बाहर नहीं जाता है, उदाहरण के लिए एक वैश्विक, जिस स्थिति में सबकुछ ठीक होना चाहिए। – UncleBens
@UncleBens: यह एक अच्छा बिंदु है – Chubsdad