अनिर्दिष्ट इम्प्लिक्ट ऑब्जेक्ट क्रिएशन


9

चूंकि P0593 निम्न-स्तरीय ऑब्जेक्ट हेरफेर के लिए ऑब्जेक्ट्स का अंतर्निहित निर्माण स्वीकार किया गया है, इसलिए वस्तुओं को अब C ++ 20 में अंतर्निहित किया जा सकता है ।

विशेष रूप से प्रस्ताव द्वारा प्रस्तुत शब्दांकन निश्चित संचालन (जैसे कि std::malloc) को कुछ प्रकार की वस्तुओं के जीवनकाल को स्वचालित रूप से बनाने और शुरू करने की अनुमति देता है , तथाकथित अंतर्निहित-जीवनकाल प्रकार , यदि ऐसी वस्तुओं का परिचय अन्यथा अपरिभाषित व्यवहार के साथ एक कार्यक्रम का कारण होगा। परिभाषित व्यवहार। [Intro.object] / 10 देखें ।

मसौदे में अब आगे कहा गया है कि अगर इस तरह की वस्तुओं के कई सेट हैं जो कि प्रोग्राम परिभाषित व्यवहार देने के लिए अंतर्निहित रूप से बनाए जा सकते हैं, तो यह अनिर्दिष्ट है कि इनमें से कौन सा सेट बनाया गया है। (प्रासंगिक वाक्य अंतिम प्रस्ताव संशोधन में मौजूद नहीं लगता है कि मैं आर 5 तक पहुंच सकता हूं, लेकिन मसौदा समिति में है)

क्या वास्तव में एक कार्यक्रम है जिसके लिए अंतर्निहित रूप से निर्मित वस्तु सेट का यह विकल्प अवलोकनीय है? दूसरे शब्दों में, क्या इस नए नियम के माध्यम से परिभाषित, लेकिन अनिर्दिष्ट, व्यवहार के साथ एक कार्यक्रम है, जैसे कि आउटपुट से अनुमान लगाना संभव है जो निहित वस्तुओं के प्रकार (एक से अधिक संभव से बाहर) के सेट बनाए गए थे?

या यह वाक्य केवल अमूर्त मशीन पर कार्यक्रम के निष्पादन (स्पष्ट प्रभाव के बिना) को स्पष्ट करने के लिए था?


2
(ओटी) यदि एक निहित निर्मित वस्तु एक int है, तो क्या हम इसे "निहित int" कह सकते हैं?
एमएम

यह स्पष्ट नहीं है कि अनिर्दिष्ट सेट से तत्व की पसंद को मालोक के बिंदु पर ज्ञात होना चाहिए
एमएम

@MM मैंने माना कि सेट के विकल्प को अमूर्त रूप से माना जाता था क्योंकि निष्पादन प्रवाह के बाहर पूरे कार्यक्रम के निष्पादन के लिए एक ही विकल्प था, लेकिन निर्माण सीधे सवाल (यानी std::malloc) में आपरेशन पर होने के साथ, अन्यथा आपको परिभाषा के साथ समस्याएं आती हैं भविष्य के आधार पर पुनरावर्ती होना।
अखरोट

मैंने उस विषय पर एक और सवाल किया, stackoverflow.com/questions/60627249 । बेशक कुछ और कोरलरीज बसंत के समय दिमाग में आती हैं लेकिन एक सवाल ..
MM

प्रस्ताव में दावा किया गया है कि ऐसा करना असंभव है, जो कि महत्वपूर्ण है क्योंकि चुनाव को सही ढंग से किए जाने का कोई रास्ता नहीं है, इससे बचने के लिए केवल अनुकूलन ही अन्यथा बहुत ( बहुत सख्ती से) मान्य होंगे।
डेविस हेरिंग

जवाबों:


9

चलो मानक में उदाहरण लेते हैं और इसे थोड़ा बदलते हैं:

#include <cstdlib>
struct X { int a, b; };
X *make_x() {
  // The call to std::malloc implicitly creates an object of type X
  // and its subobjects a and b, and returns a pointer to that X object
  // (or an object that is pointer-interconvertible ([basic.compound]) with it),
  // in order to give the subsequent class member access operations
  // defined behavior.
  X *p = (X*)std::malloc(sizeof(struct X) * 2); // me: added the *2
  p->a = 1;
  p->b = 2;
  return p;
}

पहले, वैध वस्तुओं का केवल एक सेट था जो उस भंडारण में निहित रूप से बनाया जा सकता था - यह बिल्कुल एक होना था X। लेकिन अब, हमारे पास दो Xएस के लिए भंडारण है , लेकिन उनमें से केवल एक को लिखें, और इस कार्यक्रम में कुछ भी बाकी बाइट्स को नहीं छूता है। तो वस्तुओं के कई अलग-अलग सेट हैं जिन्हें अंतर्निहित रूप से बनाया जा सकता है - शायद दो Xएस, शायद एक Xऔर दो intएस, शायद एक Xऔर आठ charएस ...

यह देखने योग्य नहीं है कि कौन सा सेट बनाया गया है, क्योंकि यदि कोई वास्तविक अवलोकन थे, तो यह केवल उन सेटों के लिए संभावनाओं को कम करेगा जो मान्य थे। अगर हमने कुछ ऐसा किया है, p[1]->a = 3तो संभावनाओं का ब्रह्मांड दो Xएस के साथ बस एक तक गिर जाता है ।

दूसरे शब्दों में, निहित-निर्मित वस्तुओं के कई सेट संभवतः तभी होते हैं जब उनकी वैधता को अलग करने के लिए कार्यक्रम में पर्याप्त अवलोकन नहीं होते हैं। यदि भेद करने का कोई तरीका होता, तो परिभाषा के अनुसार, वे सभी मान्य नहीं होंगे।


यह सिर्फ मेरा अनुमान है।
बैरी

इसलिए मैं इसे लेता हूं कि अपरिभाषित व्यवहार के बिना अलग-अलग निहित-आजीवन प्रकारों की वस्तुओं के अस्तित्व या गैर-अस्तित्व को भेद करने / निरीक्षण करने का कोई तरीका नहीं है। उस मामले में यह मुझे लगता है कि यह मानक में " अनिर्दिष्ट व्यवहार " का एकमात्र उपयोग है जो वास्तव में अलग-अलग अवलोकन परिणामों को जन्म नहीं दे सकता है।
अखरोट

1
या फिर क्या हुआ अगर केवल पहुंच प्रकार के glvalues के माध्यम से कर रहे हैं [cv] char, unsigned charया std::byte? किसी भी तुच्छ-प्रतिलिपि प्रकार की कोई वस्तु भी वहां मौजूद हो सकती है, मुझे लगता है?
23

2
यहां तक ​​कि मूल उदाहरण में, एक ऑब्जेक्ट के साथ एक सरणी ऑब्जेक्ट बनाना भी संभव है X
टीसी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.