2011-02-24 12 views
6

मैं इंटरनेट पर बहुत से पढ़ रहा हूं और ऐसा लगता है कि कई लोगों ने निम्नलिखित नियमों का उल्लेख किया है (लेकिन मुझे इसे मानक में नहीं मिला),लैवल्यू-टू-रावल्यू रूपांतरण के संबंध में, इसकी आवश्यकता कब होती है?

अतिरिक्त ऑपरेटर + (और अन्य सभी बाइनरी ऑपरेटरों) दोनों ऑपरेटरों को रैवल्यू होने की आवश्यकता होती है, और परिणाम रैवल्यू होता है। और इसी तरह ..

मैं सी ++ मानक जाँच की, और यह स्पष्ट रूप से कहा गया है कि (खंड 3.10/2),

जब भी कोई glvalue एक प्रसंग में दिखाई देता है, जहां एक prvalue की उम्मीद है, glvalue एक prvalue

(खंड 5/9) में बदल जाती है,

जब भी कोई glvalue अभिव्यक्ति प्रकट होता है एक ऑपरेटर के एक संकार्य कि कि संकार्य के लिए एक prvalue उम्मीद के रूप में, lvalue करने वाली rvalue (4.1), सरणी-टू-सूचक (4.2), या समारोह करने के लिए सूचक (4.3) मानक रूपांतरण अभिव्यक्ति को एक प्रसार के रूप में परिवर्तित करने के लिए लागू होते हैं।

यह एक शब्द का उपयोग करता है जो ऑपरेंड "अपेक्षा" करता है। हालांकि, जब मैं अतिरिक्त ऑपरेटर, गुणा ऑपरेटर इत्यादि को देखता हूं, तो यह केवल उल्लेख करता है कि परिणाम एक प्रबल है, लेकिन यह कुछ भी नहीं कहता है कि ऑपरेंड "अपेक्षित" होने के बारे में कुछ भी नहीं कहता है।

चाहे द्विआधारी ऑपरेटर वास्तव में उम्मीद ऑपरेंड होने की prvalue निम्नलिखित मामले में एक फर्क नहीं पड़ता है,

int b = 2; 
int a = b + 1; 

ख एक prvalue होने की उम्मीद है, तो उसके लिए lvalue करने वाली rvalue रूपांतरण होगा यहां, और फिर यह प्रावधान + प्रसार करेगा और एक प्रावधान वापस करेगा, और परिणाम प्रकोप एक lvalue ए को सौंपा गया है।

हालांकि, यदि बी को एक प्रवाल होने की आवश्यकता नहीं है, तो यह lvalue + prvalue होगा और परिणाम एक प्रकोप होगा।

मैं वास्तव में जानना चाहता हूं कि मानक स्पष्ट रूप से या स्पष्ट रूप से कहता है कि विभिन्न ऑपरेटरों के लिए नियम कहां है? मैं सभी ऑपरेटरों सेक्शन और केवल कुछ ऑपरेटरों की जांच करता हूं कि मानक स्पष्ट रूप से उल्लेख करते हैं कि ऑपरेंड और परिणाम लैवल्यू या रावल्यू होंगे या नहीं। अधिकांश ऑपरेटरों के लिए, मानक केवल परिणाम का उल्लेख करता है लेकिन ऑपरेंड आवश्यकता नहीं।

धन्यवाद।


Btw, मैं स्टैंडर्ड 5.19 निरंतर अभिव्यक्ति के बारे में में पाया हो सकता है बहुत बहुत "परोक्ष" मतलब है कि द्विआधारी ऑपरेटर ऑपरेंड पर lvalue करने वाली rvalue रूपांतरण की आवश्यकता है। अधिक जानकारी के लिए, अपने पिछले प्रश्न का संदर्भ लें

mixing use of constexpr and const?

सशर्त अभिव्यक्ति एक निरंतर अभिव्यक्ति है जब तक कि यह में से एक एक संभावित का मूल्यांकन उपसूचक (3.2) के रूप में निम्नलिखित शामिल है।

...

- एक lvalue करने वाली rvalue रूपांतरण (4.1) जब तक यह

---- अभिन्न या गणन प्रकार का एक glvalue लिए आवेदन किया है कि एक गैर को संदर्भित करता है वाष्पशील स्थिरांक वस्तु एक पूर्ववर्ती प्रारंभ के साथ, एक निरंतर अभिव्यक्ति के साथ प्रारंभ

पढ़ने के लिए धन्यवाद।

उत्तर

4

तो, यह आमतौर पर मानक के उन अनुमानित और बीमार निर्दिष्ट भागों में से एक है; हालांकि, 3,10

[नोट में: कुछ बिल्ट-इन ऑपरेटरों lvalue ऑपरेंड की उम्मीद है। [उदाहरण: अंतर्निहित असाइनमेंट ऑपरेटर सभी उम्मीद करते हैं कि उनके बाएं हाथ के ऑपरेशन अंतराल होंगे। - अंत उदाहरण] अन्य अंतर्निर्मित ऑपरेटर राजस्व उत्पन्न करते हैं, और कुछ उन्हें उम्मीद करते हैं। [उदाहरण: यूनरी और बाइनरी + ऑपरेटर रैवल्यू तर्कों की अपेक्षा करते हैं और परिणाम प्राप्त करते हैं। - अंत उदाहरण] खंड 5 में प्रत्येक अंतर्निर्मित ऑपरेटर की चर्चा से संकेत मिलता है कि क्या यह लैवलू ऑपरेंड की अपेक्षा करता है और क्या यह एक लाभा उत्पन्न करता है। - अंत टिप्पणी]

सूचना खराब निर्दिष्ट भाषा "खंड 5 में इंगित करता है कि क्या यह lvalue ऑपरेंड अपेक्षा करता है और यह एक lvalue पैदावार कि क्या"।

अध्याय 5 की परीक्षा से संकेत मिलता है कि प्रत्येक मामले जहां अभिव्यक्ति की आवश्यकता होती है या एक आभासी रिटर्न देता है, हालांकि, विशेष रूप से रावल के साथ व्यवहार करने वाले बहुत कम मामलों की गणना की जाती है, मुझे लगता है कि यह माना जाता है कि बाकी को रावल माना जाता है।

मुझे यह भी संदेह है कि यह मानक रूप से निर्दिष्ट है क्योंकि मानक के परिप्रेक्ष्य से, यह विशेष रूप से महत्वपूर्ण नहीं है यदि रूपांतरण ऑपरेटर द्वारा स्पष्ट रूप से या स्पष्ट रूप से किया जाता है, भले ही व्यवहार लगातार और अच्छी तरह से व्यवहार किया जाना चाहिए।

+0

धन्यवाद। हालांकि, आपके द्वारा उद्धृत उपरोक्त बयान नए मानक N3225 में हटा दिए गए थे ... कोई आश्चर्य नहीं कि मुझे यह नहीं मिला .. मुझे लगता है कि यह अलग-अलग हिस्सों से निपटने वाले विभिन्न लोगों की समस्या है और स्थिरता के मुद्दों पर बहुत कुछ नहीं सोचा । – user534498

1

(। सबसे पहले, मेरी अंग्रेजी के लिए खेद है सुधार कर रहे हैं पूरी तरह से स्वागत है)

मानक का कहना है:

§5.7-3 द्विआधारी + ऑपरेटर का परिणाम ऑपरेंड का योग है । [...]

मान लें हम अभिव्यक्ति e1 + e2 चलाते हैं और + ऑपरेटर का चयन किया है में निर्मित एक, अभिव्यक्ति अच्छी तरह से बनाई है, e1 और e2 अंकगणित प्रकार या प्रकार गणित एक कास्टिंग कर रहे हैं उपलब्ध है, और सबकुछ ठीक है, ठीक है और सही है!

तो, नियम §5.7-3 लागू होता है।

§5-1 [नोट:: दूसरी ओर, प्रत्येक संकार्य एक भाव है [...] एक अभिव्यक्ति ऑपरेटरों और ऑपरेंड है कि एक गणना निर्दिष्ट करता है का एक क्रम है। एक अभिव्यक्ति के परिणामस्वरूप एक मूल्य हो सकता है और साइड इफेक्ट्स का कारण बन सकता है।- अंत टिप्पणी]

यह एक अभिव्यक्ति का कहना है कर सकते हैं एक मूल्य में परिणाम की वजह से void भाव, delete अभिव्यक्ति या एक void समारोह की तरह है, लेकिन क्योंकि हम ने कहा है e1 + e2 एक पूरी तरह से परिभाषित अभिव्यक्ति है! , हम क्रिया "कर सकते हैं" को छोड़ सकते हैं, और इसलिए हम यह पुष्टि कर सकते हैं कि: एक अभिव्यक्ति परिणाम में परिणाम देता है।

अंतिम बिंदु: अंकगणितीय और तार्किक अंतर्निहित ऑपरेटरों के लिए, मैं समझता हूं, हालांकि यह मानकों द्वारा निर्दिष्ट नहीं है, केवल उनके ऑपरेटरों के मामले का मूल्य, चाहे उनकी मूल्य श्रेणी चाहे।

मुझे लगता है कि अभिव्यक्ति होने के साथ अंतर्निहित ऑपरेटर + (और अन्य अंकगणितीय ऑपरेटरों) को लागू करने के लिए पर्याप्त है, क्योंकि केवल मूल्य मायने रखता है, और मूल्य अभिव्यक्ति के माध्यम से पहुंचा जा सकता है। इस कारण से, मानक उन्हें स्पष्ट रूप से परिभाषित नहीं करता है।

वैसे ही, इस तरह की चीजें बहुत खराब संरचित हैं। उदाहरण के लिए, मुझे कोई स्थान निर्दिष्ट नहीं किया गया है, जब ऑपरेटर को ऑब्जेक्ट के रूप में ऑब्जेक्ट प्राप्त होता है और प्रत्यक्ष मूल्य नहीं (संदेह है कि मैं वर्तमान में हल करने का प्रयास कर रहा हूं), अगर ऑपरेटर को ऑपरेटर की गणना करने के लिए सीधे अपना मान लेना चाहिए, मूल्य ऑब्जेक्ट का मूल्यांकन करने का परिणाम है, और इसी तरह। यह स्पष्ट है कि केवल मूल्य मायने रखता है, लेकिन, वास्तव में ये कहता है कि इन चीजों के लिए मानक एक तरह का रहस्य है।

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