यह प्रश्न P0593 के नवीनतम C ++ 20 मसौदे को जोड़ने के लिए संदर्भित करता है ।
यहाँ मेरा उदाहरण है:
#include <cstdlib>
#include <cstdio>
void foo(void *p)
{
if ( std::getchar() == 'i' )
{
*(int *)p = 2;
std::printf("%d\n", *(int *)p);
}
else
{
*(float *)p = 2;
std::printf("%f\n", *(float *)p);
}
}
int main()
{
void *a = std::malloc( sizeof(int) + sizeof(float) );
if ( !a ) return EXIT_FAILURE;
foo(a);
// foo(a); [2]
}
क्या यह कोड नवीनतम ड्राफ्ट के तहत सभी इनपुट के लिए अच्छी तरह से परिभाषित है?
P0593 में व्यक्त किया गया औचित्य यह स्पष्ट करता है कि [2]
यदि दो उपयोगकर्ता इनपुट आइटम अलग-अलग हैं, तो सख्ती से अलियासिंग उल्लंघन के कारण अपरिभाषित व्यवहार को अपरिभाषित किया जाएगा। अंतर्निहित वस्तु निर्माण के बिंदु पर सिर्फ एक बार होने वाला है malloc
; इसमें असाइनमेंट स्टेटमेंट द्वारा ट्रिगर नहीं किया गया है foo
।
कार्यक्रम के किसी भी वास्तविक रन के लिए, निहित वस्तुओं के अनिर्दिष्ट सेट का एक सदस्य मौजूद है जो कार्यक्रम को अच्छी तरह से परिभाषित करेगा। लेकिन मेरे लिए यह स्पष्ट नहीं है कि निहित वस्तु के निर्माण का विकल्प [intro.object] / 10 में उल्लिखित malloc
है या नहीं; या क्या निर्णय "समय यात्रा" कर सकता है।
एक ही मुद्दा एक प्रोग्राम के लिए उत्पन्न हो सकता है जो एक बाइनरी बूँद को बफ़र में पढ़ता है और फिर इसे एक्सेस करने का एक रनटाइम निर्णय लेता है (उदाहरण के लिए डिसेरिएलाइज़ेशन; और हेडर हमें बताता है कि क्या फ़्लोट या इंट आ रहा है)।