2015-03-12 8 views
12

3.10/10 का कहना है:सी ++ में, सख्त एलियासिंग नियम में "पहुंच" का क्या अर्थ है?

तो एक कार्यक्रम प्रयास निम्नलिखित प्रकारों में से एक के अलावा अन्य के glvalue के माध्यम से पहुँच एक वस्तु की संग्रहीत मूल्य के लिए व्यवहार है unde फाई नेड:

हालांकि , "एक्सेस" शब्द कहीं भी परिभाषित नहीं किया गया है। इस संदर्भ में इसका मतलब है पढ़ें, या पढ़ या संशोधित करें?


सी मानक में यह स्पष्ट रूप से पढ़ने के लिए या संशोधित के रूप में परिभाषित किया गया है।

1,9/8: सी ++ 11 में हालांकि यह अलग अलग समय पर अलग अलग अर्थ के साथ इस्तेमाल किया जा करने के लिए लगता है उदाहरण

अस्थिर वस्तुओं तक पहुंच सख्ती से सार मशीन के नियमों के अनुसार मूल्यांकन किया जाता है ।

जाहिर है इस पढ़ा है या संशोधित करने, लेकिन इस तरह की 1.10/24 के रूप में कई अन्य स्थानों पर करने के लिए है:

  • पहुँच या संशोधित एक अस्थिर वस्तु, या

इसका उपयोग इस प्रकार किया जाता है जैसे कि इसका मतलब केवल पढ़ें।

+1

आप शीर्षक को छोटा कर सकते हैं: "सी ++ में, 'पहुंच' का क्या अर्थ है?" यह एक बड़ा सवाल है। (बेशक, सख्त एलियासिंग नियम के बारे में विशेष रूप से, इरादा निश्चित रूप से सी के समान "पढ़ना या संशोधित करना" है। – Nemo

+0

@ नीमो सहमत, हालांकि मुझे इस विशेष मामले में सबसे अधिक दिलचस्पी है। यह शायद एक अलग सवाल हो सकता है। –

+0

वैसे, इस खंड में उनके इरादे के बावजूद, उन्होंने निश्चित रूप से इसे स्पष्ट रूप से नहीं बताया है, इसलिए मैं कहूंगा कि आपको निश्चित रूप से कल्पना में एक बग मिला है। – Nemo

उत्तर

4

इसका अर्थ दोनों पढ़ना और लिखना चाहिए, या नियम का अधिक मतलब नहीं होगा। http://blog.llvm.org/2011/05/what-every-c-programmer-should-know.html से उदाहरण पर विचार करें: केवल तभी संकलक P[i] उपनाम P कि कोई भी मान सकते हैं

float *P; 
void zero_array() { 
    int i; 
    for (i = 0; i < 10000; ++i) 
     P[i] = 0.0f; 
} 

ऊपर के उदाहरण कोड एक memset में अनुकूलित किया जा सकता है। लेकिन एक ऐसी दुनिया पर विचार करें जिसमें एक अस्वीकृत ग्लैल्यू से पढ़ना यूबी है, तो उपर्युक्त कोड P[i] उपनाम P कुछ i के लिए यूबी का आह्वान नहीं करेगा - उदा।, अगर किसी ने P = (float *) &P; किया है, क्योंकि सभी P पढ़ते हैं तो पूरी तरह से कानूनी हैं - वे सभी lvalue अभिव्यक्ति P का उपयोग करते हैं।


संपादित: CWG issue 1531 बिंदु पर सीधे है। यह मुद्दा अप्रैल 2013 में डीआर (दोष रिपोर्ट) की स्थिति में ले जाया गया था, लेकिन किसी भी कारण से संकल्प, कामकाजी कागज पर लागू नहीं किया गया था।

+0

ग्रेट उदाहरण (जैसा कि अन्य टिप्पणी में आपका उदाहरण है) –

+0

मुझे मानक के साथ कोई कठिनाई नहीं होगी कि पीओडीएस उपज के क्रॉस-टाइप रीड-इटेटर्मिनेट वैल्यू को पढ़ता है, और पीओडीएस के क्रॉस-टाइप लिखने से संभावित रूप से इसे- इंटरमीडिएट वैल्यू, कम से कम अगर मानक स्पष्ट होता है कि इंटरमीडिएट वैल्यूज के साथ काम करते समय क्या हो सकता है और क्या नहीं हो सकता है, जिसमें कोई प्राकृतिक जाल प्रतिनिधित्व नहीं है (मानक को किसी भी बिंदु को संबोधित करना चाहिए, आईएमएचओ)। – supercat

2

मैं एक भाषा वकील होने का दावा नहीं करता हूं। हालांकि ...

मैं "ऑब्जेक्ट के संग्रहीत मूल्य तक पहुंच" वाक्यांश को "" किसी ऑब्जेक्ट के संग्रहीत मूल्य के रूप में "वाक्यांश" की व्याख्या करता हूं।

यह व्याख्या पिछले पैराग्राफ को और अधिक समझ में आता है, जो किसी ऑब्जेक्ट को संशोधित करने के बारे में बात करता है।

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

+1

इस पढ़ने से, 'int a = 0; * ((लघु *) और ए) = 100; std :: cout << a; 'सख्त एलियासिंग नहीं तोड़ता है। यह थोड़ा समझ में आता है। –

+0

@ टी.सी. मुझे पता है तुम्हारा क्या मतलब है। क्या मानक में कुछ भी है जहां 'read'' लिखने की तुलना में अधिक प्रतिबंधित है? –

संबंधित मुद्दे