संस्करणों के बीच C ++ में अभिव्यक्ति के प्रकार क्यों बदल गए?


13

मैं C ++ के अभिव्यक्ति प्रकारों को समझने की कोशिश करता हूं और जितना अधिक मैं पढ़ता हूं, मैं उतना अधिक भ्रमित था, क्योंकि मुझे सी ++ ड्राफ्ट को पचाने में बहुत मुश्किल लगता है और इसलिए अन्य संसाधनों को पसंद करते हैं, लेकिन वे या तो एक दूसरे के विरोधाभास करते हैं या खाते में नहीं लेते हैं C ++ वर्जन के बीच वर्डिंग और डेफिनेशन में भारी बदलाव होता है।

निम्नलिखित में मैं निम्नलिखित ड्राफ्ट का उल्लेख करता हूं:

  • C ++ 11 [ n3690 ] (अंतिम मसौदा)
  • C ++ 17 [ n4659 ] (अंतिम मसौदा)
  • C ++ 20 [ n4835 ] (वर्तमान मसौदा)

C++11 3.10 अंतराल और अंतराल

... एक प्रचलन ("शुद्ध" अवतरण) एक प्रचलन है जो कि एक xvalue नहीं है। [उदाहरण: एक फ़ंक्शन को कॉल करने का परिणाम जिसका वापसी प्रकार एक संदर्भ नहीं है एक प्रचलन है। शाब्दिक मूल्य जैसे कि 12, 7.3e5, या सत्य भी एक प्रचलन है। - अंतिम उदाहरण]

C++17 3.10 अंतराल और अंतराल

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

C++20 7.2.1 मूल्य श्रेणियां *

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

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


3
संस्करण विशिष्ट भाषा टैग पर प्रतिबंध लगाने के लिए मैं सभी हूं। सिवाय इस तरह के सवालों के।
उत्सुकता


" इस बात पर ध्यान न दें कि सी ++ संस्करणों के बीच शब्दांकन और परिभाषा में भारी परिवर्तन होता है। " लेकिन परिभाषा वास्तव में नहीं बदली। बहुत अधिक अभिव्यक्ति जो C ++ 11 में एक प्रचलन थी, अभी भी C ++ 20 में एक प्रचलन है।
निकोल बोलस

संस्करण के बीच 'विरोधाभास (आयन)' कहां है? आपका सवाल क्या है?
गैलीगेटर

1
C ++ 20 परिवर्तन के लिए क्षमा करें , लेकिन मैंने मानक में एक असंगतता देखी थी।
मैगीयरो

जवाबों:


5

मूल प्रचलन की परिभाषा सिर्फ एक लेबल थी: हमने कुछ निश्चित अंतराल (अर्थात्, जो कि xvalues ​​नहीं हैं) को अलग रखा और उन्हें एक नाम दिया। असामान्य thisउपयोग (कम या ज्यादा क्योंकि वे अस्थायी हैं) को छोड़कर उनके पते को लेना असंभव है , इसलिए कुछ निर्माणों के बिना निश्चित स्वतंत्रता को उनके निर्माण और प्रसार के साथ लिया जा सकता है। ( उन्हें "पहचान नहीं" की हालिया चर्चा भी देखें ।)

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

उदाहरण के लिए, नई मूल्य श्रेणी की परिभाषाओं को इतना सरल होने के रूप में देखा गया था कि कम उदाहरणों की आवश्यकता थी। अभी भी xvalues ​​के लिए एक है (जो उपशीर्षक श्रेणी के हैं)।


आपको और टिप्पणीकारों को धन्यवाद! बहुत सुंदर यह समझाता है!
डैनियल स्टीफेंस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.