इस विजुअल C ++ ब्लॉग के लेख से संदर्भों के संदर्भ में :
... सी ++ आपको गलती से अस्थायी रूप से संशोधित नहीं करना चाहता है, लेकिन एक गैर-कांस्टेबल सदस्य फ़ंक्शन को सीधे रूप से संशोधित करने योग्य फ़ंक्शन पर कॉल करना स्पष्ट है, इसलिए इसकी अनुमति है ...
मूल रूप से, आपको अस्थायी कारणों को संशोधित करने का प्रयास नहीं करना चाहिए क्योंकि वे अस्थायी वस्तुएं हैं और अब किसी भी क्षण मर जाएंगे। जिस कारण से आपको नॉन-कास्ट विधियों को कॉल करने की अनुमति दी गई है, ठीक है, जब तक आप जानते हैं कि आप क्या कर रहे हैं और आप इसके बारे में स्पष्ट हैं (जैसे, reinterpret_cast का उपयोग करके) कुछ "बेवकूफ" चीजें करने के लिए आपका स्वागत है। लेकिन अगर आप एक अस्थायी को गैर-कॉन्स्टेबल संदर्भ में बाँधते हैं, तो आप इसे "हमेशा के लिए" पास रख सकते हैं, ताकि आपके ऑब्जेक्ट का हेरफेर गायब हो जाए, क्योंकि कहीं न कहीं जिस तरह से आप पूरी तरह से भूल गए थे यह एक अस्थायी था।
अगर मैं तुम थे, मैं अपने कार्यों के डिजाइन पर फिर से विचार करूंगा। क्यों जी () संदर्भ को स्वीकार कर रहा है, क्या यह पैरामीटर को संशोधित करता है? यदि नहीं, तो इसे संदर्भ दें, यदि हाँ, तो आप इसे अस्थायी रूप से पारित करने का प्रयास क्यों करते हैं, क्या आपको इसकी परवाह नहीं है कि यह एक अस्थायी है जिसे आप संशोधित कर रहे हैं? गेटेक्स () वैसे भी अस्थायी क्यों लौट रहा है? यदि आप हमारे साथ अपने वास्तविक परिदृश्य को साझा करते हैं और जो आप पूरा करने की कोशिश कर रहे हैं, तो आपको यह करने के लिए कुछ अच्छे सुझाव मिल सकते हैं।
भाषा के खिलाफ जाना और संकलक को बेवकूफ बनाना शायद ही कभी समस्याओं को हल करता है - आमतौर पर यह समस्याएं पैदा करता है।
संपादित करें: टिप्पणी में प्रश्नों को संबोधित करना: 1)
X& x = getx().ref(); // OK when will x die?
- मुझे नहीं पता है और मुझे परवाह नहीं है, क्योंकि यह वास्तव में "भाषा के खिलाफ जाने" से मेरा मतलब है। भाषा कहती है, "जब तक कि वे संदर्भ के दायरे से बाहर नहीं जाते हैं, तब तक वे अस्थायी बयान के अंत में मर जाते हैं, जब तक कि वे संदर्भ के लिए बाध्य नहीं होते हैं।" उस नियम को लागू करते हुए, ऐसा लगता है कि x अगले बयान की शुरुआत में पहले से ही मर चुका है, क्योंकि यह कॉन्स्ट रेफरेंस के लिए बाध्य नहीं है (कंपाइलर को पता नहीं है कि रेफ () रिटर्न क्या है)। हालांकि यह सिर्फ एक अनुमान है।
2) मैंने उद्देश्य स्पष्ट रूप से कहा: आपको अस्थायी लोगों को संशोधित करने की अनुमति नहीं है, क्योंकि यह सिर्फ समझ में नहीं आता है (सी ++ 0x rvalue संदर्भों की अनदेखी)। सवाल "फिर मुझे गैर-कास्ट सदस्यों को कॉल करने की अनुमति क्यों दी गई है?" एक अच्छा है, लेकिन मेरे पास पहले से ही ऊपर बताए गए से बेहतर जवाब नहीं है।
3) ठीक है, अगर मैं X& x = getx().ref();
बयान के अंत में मरने के बारे में x सही हूं , तो समस्याएं स्पष्ट हैं।
वैसे भी, आपके प्रश्न और टिप्पणियों के आधार पर मुझे नहीं लगता कि ये अतिरिक्त उत्तर आपको संतुष्ट करेंगे। यहाँ एक अंतिम प्रयास / सारांश दिया गया है: C ++ समिति ने निर्णय लिया कि यह अस्थायी लोगों को संशोधित करने का कोई मतलब नहीं है, इसलिए, उन्होंने गैर-कास्ट संदर्भों के लिए बाध्यकारी को अस्वीकार कर दिया। हो सकता है कुछ संकलक कार्यान्वयन या ऐतिहासिक मुद्दे भी शामिल थे, मुझे नहीं पता। फिर, कुछ विशिष्ट मामले सामने आए, और यह तय किया गया कि सभी बाधाओं के खिलाफ, वे अभी भी गैर-कॉन्स्टेंट विधि के माध्यम से प्रत्यक्ष संशोधन की अनुमति देंगे। लेकिन यह एक अपवाद है - आपको आमतौर पर अस्थायी लोगों को संशोधित करने की अनुमति नहीं है। हां, C ++ अक्सर अजीब होता है।