अपना पहला कोड स्निपेट अस्वीकार करने के लिए, कंपाइलर सरल नियम लागू करता है जिसे आप सीधे अस्थायी संदर्भ में अस्थायी नहीं जोड़ सकते हैं।
दूसरे को अस्वीकार करने के लिए, कंपाइलर शायद एक नियम लागू कर सकता है जो return
संदर्भ द्वारा लौटाए गए फ़ंक्शन का कथन स्वचालित चर का नाम नहीं हो सकता है (बाय-वैल्यू फ़ंक्शन पैरामीटर सहित)। यह मुझे एक काफी आसान नियम भी लगता है।
मुझे नहीं पता कि मानक क्यों निर्दिष्ट नहीं करता है कि ऐसा करने से बीमार हो गया है। मैं इसके लिए किसी भी वैध उपयोग के बारे में नहीं सोच सकता, लेकिन शायद पहले मानक के समय यह कुछ कार्यान्वयन या अन्य पर अत्यधिक बोझ पैदा करेगा। या शायद यह महसूस किया गया था कि यह केवल आधे फिक्स है और इसके साथ परेशान करने के लायक नहीं है (लटकने वाले संदर्भ बनाने के कई अन्य तरीके हैं, यह सिर्फ उनमें से एक को ब्लॉक करता है)।
मानक सामान्य रूप से मानक नहीं है क्योंकि आप एक अस्थायी के लिए एक गैर-कॉन्स संदर्भ बनाते हैं, यह है कि यह ठीक होने पर अवसर होते हैं। उदाहरण के लिए:
struct Foo {
static void set(Foo &f) { f.val = 0; }
int val;
int bar() {
set(*this);
return val;
}
};
std::cout << Foo().bar() << "\n";
यहाँ Foo()
एक अस्थायी है, और लाइन set(*this)
एक गैर स्थिरांक संदर्भ के लिए यह बांधता है (लेकिन सीधे नहीं, यह एक lvalue अभिव्यक्ति *this
कुछ समय लेकिन दूसरों कि एक अस्थायी को संदर्भित करता है का उपयोग करता है) । यहां कोई समस्या नहीं है, अस्थायी रूप से संदर्भ संदर्भित करता है। तो यह किसी भी अस्थायी रूप से किसी भी अस्थायी संदर्भ से किसी भी अस्थायी होने से रोकने के लिए भाषा के लिए अनावश्यक रूप से प्रतिबंधित होगा।
स्रोत
2012-03-06 15:53:46
यह यूबी है (ठीक है, संदर्भ का उपयोग, वैसे भी) और कोई भी सील कंपाइलर आपको इसके बारे में चेतावनी देगा। –