से वापसी पर विचार करें एक छोटी इकाई परीक्षण का मामलाभिन्नता और संदर्भ
struct A
{
virtual void func(){}
A& foo()
{
A *obj = reinterpret_cast<A*>(0xdeadbeef);
return *obj; //1
}
};
int main()
{
A obj = obj.foo();
}
लाइन 1
पर है यह कार्यान्वयन परिभाषित/अनिर्दिष्ट सम्मान नहीं होगा कि के रूप में हम संदर्भ द्वारा लौट रहे हैं और इस कार्यक्रम के लिए एक है, तो दुर्घटना नहीं होता ऑब्जेक्ट की ओर इशारा करने के लिए स्पष्ट पहुंच नहीं बनाई गई है?
मुझे अपने सहयोगियों में से एक के साथ तर्क था जिसमें उन्होंने उल्लेख किया था कि अधिकांश मामलों में कंपाइलर obj
की अव्यवस्था को अनुकूलित करेगा क्योंकि हम इसे संदर्भ द्वारा वापस कर रहे हैं और यह कोड क्रैश नहीं होगा?
धन्यवाद
मेरी समझ यह है कि: कंपाइलर 1 के लिए बाध्य नहीं है) रन कोड जिसके परिणामस्वरूप कुछ भी नहीं हो रहा है 2) रन कोड जो एक अपरिभाषित व्यवहार उत्पन्न करता है: http://blog.llvm.org/2011/05/what-every- सी-प्रोग्रामर-चाहिए-know_14.html – Patashu
यहां तक कि मेरा मानना है कि व्यवहार अपरिभाषित है और हमें इस मामले में अंतर्निहित कार्यान्वयन पर भरोसा नहीं करना चाहिए। –
यह अनिर्धारित व्यवहार है और आपको कभी भी अपरिभाषित व्यवहार पर भरोसा नहीं करना चाहिए जो आपको लगता है कि यह क्या करेगा, हां। लेकिन यह आवश्यक रूप से क्रैश नहीं होगा, अगर संकलक निर्णय लेता है कि यह मृत कोड है या अनिर्धारित है और अकादमिक परिप्रेक्ष्य से बोलने के लिए कोड तैयार करने योग्य नहीं है। – Patashu