अगर हम तुच्छ डिफ़ॉल्ट निर्माणकर्ता कोई कार्रवाई नहीं करते हैं तो हम मॉलॉक का उपयोग करके तुच्छ रूप से रचनात्मक वस्तुओं को क्यों नहीं बना सकते हैं?


14

मुझे तुच्छ डिफ़ॉल्ट कंस्ट्रक्टर के बारे में cppreference से उद्धृत निम्नलिखित पैराग्राफ को समझने में कठिनाई होती है । मैंने स्टैकओवरफ़्लो खोज लिया है, लेकिन अभी भी स्पष्ट उत्तर नहीं मिला है। तो कृपया मदद करें।

एक सामान्य डिफ़ॉल्ट कंस्ट्रक्टर एक ऐसा कंस्ट्रक्टर है जो कोई कार्य नहीं करता है। C भाषा (POD प्रकार) के साथ संगत सभी डेटा प्रकार तुच्छ रूप से डिफ़ॉल्ट-रचनात्मक हैं। सी के विपरीत, हालांकि, तुच्छ डिफ़ॉल्ट निर्माणकर्ताओं के साथ ऑब्जेक्ट्स केवल उपयुक्त रूप से संरेखित भंडारण को फिर से स्थापित करके नहीं बनाया जा सकता है, जैसे कि मेमोरी को std के साथ आवंटित किया गया है :: मॉलोक: प्लेसमेंट-नई को एक नई वस्तु को औपचारिक रूप से पेश करने और संभावित अनिर्धारित व्यवहार से बचने के लिए आवश्यक है।

विशेष रूप से, यदि तुच्छ डिफ़ॉल्ट निर्माता कुछ भी नहीं करता है, तो हम भंडारण को फिर से क्यों नहीं दिखा सकते हैं और दिखावा करते हैं कि दिए गए प्रकार के साथ कोई वस्तु है? क्या आप संभावित अपरिभाषित व्यवहार के लिए कुछ उदाहरण प्रदान कर सकते हैं जो इसका कारण होगा?


एक कंपाइलर का सबसे महत्वपूर्ण काम स्रोत कोड को संकलित करना नहीं है, लेकिन संभवतः अमान्य कोड को अस्वीकार करना है। जब आप मॉलॉक () का उपयोग करते हैं तो यह ऐसा नहीं कर सकता।
हंस पासेंट

6
बहुत सरल कारण। प्रोग्रामर के लिए पागल चीजों को करने के लिए कम अवसर होते हैं, कंपाइलर के लिए पागल चीजें (एग्रेसिव ऑप्टिमाइजेशन) करने के लिए अधिक अवसर होते हैं।
एन। 'सर्वनाम' मी।

1
समान कारणों से जो आप अभी नहीं कर सकते *reinterpret_cast<float*>(&someNonFloatObject) = 0.1f;। C ++ में ऑब्जेक्ट्स और ऑब्जेक्ट लाइफटाइम्स की अवधारणा है, जो सार मशीन पर निर्दिष्ट है, और सिर्फ इसलिए कि स्टोरेज से ऑब्जेक्ट बनाने के लिए कोई CPU निर्देश नहीं है, इसका मतलब यह नहीं है कि अमूर्त मशीन पर कोई अंतर नहीं है।
मैक्स लैंगहोफ़

1
@HansPassant एक कंपाइलर जो सभी कोड को अस्वीकार करता है सभी अमान्य कोड को अस्वीकार करता है। वैसे भी, यूबी वाले कार्यक्रमों को अस्वीकार करना कॉपलर का काम नहीं है।
एन। 'सर्वनाम' मी।

जवाबों:


7

P0593R5 यह उदाहरण देता है:

struct X { int a, b; };
X *make_x() {
  X *p = (X*)malloc(sizeof(struct X));
  p->a = 1;
  p->b = 2;
  return p;
}

और जानकारी:

जब C ++ कंपाइलर के साथ संकलित किया जाता है, तो इस कोड में अपरिभाषित व्यवहार होता है, क्योंकि p-> एक एक्स ऑब्जेक्ट के int सबोबेज को लिखने का प्रयास करता है, और इस प्रोग्राम ने कभी भी एक्स ऑब्जेक्ट नहीं बनाया और न ही कोई इंटोबाइट।

प्रति [intro.object] p1,

एक वस्तु एक परिभाषा द्वारा बनाई गई है, एक नई-अभिव्यक्ति द्वारा, जब एक संघ के सक्रिय सदस्य को बदलकर या जब एक अस्थायी वस्तु बनाई जाती है।

... और इस कार्यक्रम ने इनमें से कुछ भी नहीं किया।

व्यवहार में यह काम करता है और यूबी स्थिति को मानक में एक दोष के रूप में कुछ और की तुलना में अधिक माना जाता है। कागज का पूरा उद्देश्य अन्य चीजों को तोड़ने के बिना उस मुद्दे और इसी तरह के मामलों को ठीक करने का एक तरीका प्रस्तावित करना है।


1

"शुद्धता" कारण के लिए।

विकल्प और वास्तविक स्थिति यह थी कि भंडारण के प्रत्येक क्षेत्र में एक ही समय में उस भंडारण में सभी वस्तुओं को शामिल किया जाएगा। कुछ समिति सदस्य यथास्थिति से असहज हैं और बहुत से लोगों को एक ही स्थान पर (एक आभासी, असंगठित राज्य में) कई वस्तुओं के असीम रूप से होने की धारणा की आशंका है।

भंडारण के क्षेत्र में असीम रूप से कई वस्तुओं के साथ कोई भी तर्क का मुद्दा नहीं दिखा सका है।

क्योंकि उनके पास मानक के अलग-अलग खंड हैं, जो चीजों के विपरीत हैं, समिति के सदस्यों ने मानक के सबसे खराब हिस्से में से एक को गंभीरता से लेने का फैसला किया।

इसके अलावा, स्ट्रिंग शाब्दिक का उपयोग करने की सख्त अनुमति नहीं है, यदि आप वास्तव में गंभीरता से लेते हैं कि मानक का एक हिस्सा।


स्ट्रिंग साहित्यिक का उपयोग करने की सख्त अनुमति नहीं हैtype_infoवस्तुओं के बारे में समान CWG मुद्दा है। क्या आपने 'बाउट स्ट्रिंग लिटरल्स' की सूचना दी है?
भाषा वकील
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.