2011-04-06 10 views
13

किसी को भी जब तक कि किसी unevaluated संकार्य (खण्ड 5) या उसके उपसूचक है ISO N3242 §3.2, 2 बिंदुक्या कोई मौजूदा सी ++ 0x मानक ड्राफ्ट के इस पैराग्राफ को समझा सकता है?

कोई व्यंजक से इस बयान की व्याख्या कर सकते संभावित मूल्यांकन किया जाता है। एक परिवर्तनीय या गैर-अधिभारित फ़ंक्शन जिसका नाम संभावित रूप से मूल्यांकन की गई अभिव्यक्ति के रूप में प्रकट होता है odr-used जब तक यह एक ऐसी वस्तु नहीं है जो निरंतर अभिव्यक्ति (5.1 9) और lvalue-to-rvalue रूपांतरण में दिखाई देने के लिए आवश्यकताओं को पूरा करती है (4.1) तत्काल लागू है। यह odr-used है यदि यह संभावित रूप से मूल्यांकन अभिव्यक्ति ( के शरीर में अंतर्निहित परिवर्तन के परिणामस्वरूप गैर स्थैतिक सदस्य फ़ंक्शन (9.3.1) के रूप में दिखाई देता है।

आईएसओ मानक 2003: कहते हैं

कोई व्यंजक संभावित मूल्यांकन किया जाता है, जब तक यह प्रकट होता है, जहां एक अभिन्न निरंतर एक्सप्रेशन की आवश्यकता होगी (5.19 देखें), sizeof ऑपरेटर के संकार्य है (5.3 .3), या टाइपिड ऑपरेटर का ऑपरेंड है और अभिव्यक्ति पॉलिमॉर्फिक क्लास प्रकार (5.2.8) का एक अंतराल निर्दिष्ट नहीं करता है। ऑब्जेक्ट या गैर-अधिभारित फ़ंक्शन का उपयोग किया जाता है यदि इसका नाम संभावित रूप से मूल्यांकन अभिव्यक्ति में प्रकट होता है।

इन बयानों में वास्तविक अंतर क्या है?

क्या कोई इसे किसी उदाहरण/प्रोग्राम की सहायता से समझा सकता है?

+0

@Andrea: न केवल समझाता है ... मैंने अंतर/तुलना के लिए कहा .. पुराने के लिए एक नया – 1User

+1

मैंने शीर्षक में प्रश्न को समेटने का प्रयास किया, इसे ठीक करने में संकोच न करें। –

उत्तर

12

"अनियंत्रित ऑपरेंड" प्रतिस्थापन "आकार के ऑपरेटर (5.3.3) का संचालन है, या टाइपिड ऑपरेटर का ऑपरेंड है और अभिव्यक्ति पॉलिमॉर्फिक क्लास प्रकार (5.2.8)" का एक अंतराल निर्दिष्ट नहीं करती है। इसका एक ही मूल उद्देश्य है, लेकिन ऑपरेटरों के सी ++ 0x मानक में सभी मामलों को सूचीबद्ध करने का प्रयास नहीं करता है जिनके संचालन का मूल्यांकन नहीं किया जाता है। उदाहरण के लिए decltype एक नया है।

"ओडीआर-प्रयुक्त" प्रतिस्थापित "प्रतिस्थापित", मुझे लगता है कि उन्होंने पाया कि "उपयोग" अकेले मानक में "उपयोग" शब्द के अन्य उपयोगों के साथ संदिग्ध हो सकता है। दोनों मामलों में, हालांकि, यह "प्रयुक्त" की भावना को परिभाषित कर रहा है जो ओडीआर के लिए प्रासंगिक है।

तो वे वास्तव में बदलाव नहीं कर रहे हैं, केवल सी -+ 0x के लिए पुनः-शब्द अपडेट किए गए हैं।

एक चर या गैर अतिभारित समारोह जिसका नाम एक संभवतः से मूल्यांकन अभिव्यक्ति के रूप में प्रकट होता है है ओडीआर से इस्तेमाल किया जब तक कि यह एक वस्तु कि के लिए आवश्यकताओं को संतुष्ट करता है:

यह एक परिवर्तन है निरंतर अभिव्यक्ति (5.1 9) में दिखाई दे रहा है और lvalue-to-rvalue रूपांतरण (4.1) तुरंत
लागू होता है।

बनाम।

एक वस्तु या गैर अतिभारित कि इसके नाम का एक संभावित मूल्यांकन
अभिव्यक्ति में प्रदर्शित होता है या समारोह प्रयोग किया जाता है।

मान लीजिए a वैश्विक दायरे पर static const int है। तो सी ++ 03 में यह निम्नलिखित बयान में नहीं किया जाता है:

char x[a]; 

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

void foo(int); foo(a); 

क्योंकि संदर्भ को निरंतर अभिव्यक्ति की आवश्यकता नहीं है।

सी ++ 0x, a किसी भी मामले में odr-used नहीं है। इसे निरंतर अभिव्यक्ति में रहने की अनुमति है, और फ़ंक्शन कॉल में, lvalue-rvalue रूपांतरण तुरंत लागू होता है (क्योंकि foo इसके पैरामीटर को मान द्वारा लेता है, संदर्भ नहीं)। तो यह "जब तक" के लिए योग्य नहीं है जो सी ++ 03 में मौजूद नहीं था।

"संभावित मूल्यांकन" की परिभाषा में भी एक अंतर है। पहले उदाहरण में, char x[a], a का संभावित रूप से सी ++ 03 में मूल्यांकन किया गया है लेकिन सी ++ 0x में नहीं। मैंने जांच नहीं की है कि मानक में कुछ भी "संभावित मूल्यांकन" का उपयोग करता है, जो इस परिवर्तन से प्रभावित हो सकता है। यदि इसका केवल यहां उल्लेख किया गया है तो इसका वह हिस्सा कोई बदलाव नहीं है, यह सिर्फ इतना है कि अपवाद को "संभावित रूप से मूल्यांकन" से "उपयोग" में स्थानांतरित कर दिया गया है।

+0

क्या आप इस परिवर्तन के बारे में एक और उदाहरण के साथ समझा सकते हैं – 1User

+0

मुझे एक चीज़ नहीं मिलती है, हालांकि घोषणा में 'char x [a]; '' a' का उपयोग नहीं किया जाता है, तो कैसे कंपाइलर को सरणी के आकार को जानने के लिए जा रहा है स्मृति पर सरणी वस्तु? –

+0

@ श्री अनीबिस: ऑब्जेक्ट 'ए' का उपयोग नहीं किया जाता है, इसका मूल्य है। चूंकि यह मान संकलन समय पर ज्ञात है, इसलिए ऑब्जेक्ट को रनटाइम पर कोई आवश्यकता नहीं है। –

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