मैं सिर्फ as-if नियम और अस्थिर कीवर्ड के लिए एक विस्तृत संदर्भ जोड़ने जा रहा हूं । (इन पृष्ठों के निचले भाग में, मूल चश्मे को वापस ट्रेस करने के लिए "यह भी देखें" और "संदर्भ" का पालन करें, लेकिन मुझे पढ़ने / समझने के लिए cppreference.com बहुत आसान लगता है।)
विशेष रूप से, मैं चाहता हूं कि आप इस खंड को पढ़ें
वाष्पशील वस्तु - एक ऐसी वस्तु जिसका प्रकार वाष्पशील-योग्य है, या एक वाष्पशील वस्तु का एक उप-खंड है, या एक कांस्टेबल-वाष्पशील वस्तु का एक परस्पर उप-खंड है। अस्थिर-योग्य प्रकार की शानदार अभिव्यक्ति के माध्यम से किए गए हर एक्सेस (पढ़ने या लिखने का संचालन, सदस्य फ़ंक्शन कॉल, आदि) को अनुकूलन के प्रयोजनों के लिए दृश्यमान प्रभाव के रूप में माना जाता है (अर्थात, निष्पादन के एक ही धागे के भीतर, अस्थिर पहुँच को किसी अन्य दृश्यमान साइड इफ़ेक्ट के साथ ऑप्टिमाइज़ या रीऑर्डर नहीं किया जा सकता जो अनुक्रमित-पहले या अनुक्रमित-अस्थिर पहुँच के बाद होता है। यह अस्थिर ऑब्जेक्ट्स को सिग्नल हैंडलर के साथ संचार के लिए उपयुक्त बनाता है, लेकिन निष्पादन के किसी अन्य थ्रेड के साथ, std या memory_order देखें ) का है। एक गैर-वाष्पशील चमक के माध्यम से एक अस्थिर वस्तु को संदर्भित करने का कोई भी प्रयास (जैसे संदर्भ या सूचक के माध्यम से गैर-वाष्पशील प्रकार) के लिए अपरिभाषित व्यवहार होता है।
इसलिए विशेष रूप से वाष्पशील कीवर्ड ग्लवल्स पर संकलक अनुकूलन को अक्षम करने के बारे में है । यहां केवल एक चीज जो वाष्पशील कीवर्ड को प्रभावित कर सकती है return x
, संभवतः , कंपाइलर बाकी फ़ंक्शन के साथ जो चाहे कर सकता है।
कंपाइलर रिटर्न को कितना ऑप्टिमाइज़ कर सकता है यह इस बात पर निर्भर करता है कि कंपाइलर को इस मामले में एक्स के एक्सेस को ऑप्टिमाइज़ करने की कितनी अनुमति है (क्योंकि यह किसी भी चीज़ को रीऑर्डर नहीं कर रहा है, और सख्ती से बोलना, रिटर्न एक्सप्रेशन को हटा नहीं रहा है। एक्सेस है। , लेकिन यह स्टैक को पढ़ना और लिखना है, जिसे सुव्यवस्थित करने में सक्षम होना चाहिए।) तो जैसा कि मैंने इसे पढ़ा, यह एक ग्रे क्षेत्र है कि कंपाइलर को ऑप्टिमाइज़ करने की कितनी अनुमति है, और दोनों तरीकों से आसानी से तर्क दिया जा सकता है।
साइड नोट: इन मामलों में, हमेशा मान लें कि संकलक आपके इच्छित / विपरीत के विपरीत काम करेगा। आपको या तो अनुकूलन को अक्षम करना चाहिए (कम से कम इस मॉड्यूल के लिए), या जो आप चाहते हैं उसके लिए एक अधिक परिभाषित व्यवहार खोजने की कोशिश करें। (यह भी क्यों यूनिट परीक्षण इतना महत्वपूर्ण है) यदि आप मानते हैं कि यह एक दोष है, तो आपको इसे सी ++ के डेवलपर्स के साथ लाना चाहिए।
यह सब पढ़ना अभी भी कठिन है, इसलिए जो मुझे लगता है कि यह प्रासंगिक है उसे शामिल करने की कोशिश कर रहा है ताकि आप इसे स्वयं पढ़ सकें।
glvalue एक glvalue अभिव्यक्ति या तो lvalue या xvalue है।
गुण:
एक प्रचलन को कथित रूप से एक प्रचलन में लवल्यू-टू-रिवल्यू, एरे-टू-पॉइंटर या फ़ंक्शन-टू-पॉइंटर निहित रूपांतरण के साथ परिवर्तित किया जा सकता है। एक ग्लव्यू बहुरूपक हो सकता है: जिस गतिशील प्रकार की पहचान करता है वह जरूरी नहीं कि अभिव्यक्ति का स्थिर प्रकार है। एक चमक में अपूर्ण प्रकार हो सकता है, जहां अभिव्यक्ति की अनुमति है।
xvalue निम्नलिखित अभिव्यक्तियाँ xvalue अभिव्यक्तियाँ हैं:
एक फ़ंक्शन कॉल या एक अतिभारित ऑपरेटर अभिव्यक्ति, जिसका वापसी प्रकार वस्तु के लिए संदर्भ है, जैसे कि std :: move (x); एक [एन], बिल्ट-इन सबस्क्रिप्ट अभिव्यक्ति, जहां एक ऑपरेंड एक सरणी व्याप्त है; am, ऑब्जेक्ट एक्सप्रेशन का सदस्य, जहाँ एक a rvalue है और m एक गैर-स्थैतिक डेटा गैर-संदर्भ प्रकार का सदस्य है; a। * एमपी, ऑब्जेक्ट एक्सप्रेशन के सदस्य के लिए पॉइंटर, जहां एक रव्यू है और एमपी डेटा सदस्य के लिए एक पॉइंटर है; ए ? बी: सी, कुछ बी और सी के लिए टर्नेरी सशर्त अभिव्यक्ति (विस्तार के लिए परिभाषा देखें); ऑब्जेक्ट प्रकार, जैसे कि static_cast (x) के संदर्भ के संदर्भ में एक कास्ट एक्सप्रेशन; कोई भी अभिव्यक्ति जो अस्थायी वस्तुकरण के बाद, एक अस्थायी वस्तु को डिजाइन करती है। (C ++ 17 के बाद से) गुण:
नीचे के रूप में समान (नीचे)। नीचे के समान चमक (नीचे)। विशेष रूप से, सभी अंतरालों की तरह, xvalues संदर्भ संदर्भों को बांधते हैं, और सभी गल्र्स की तरह, xvalues बहुरूपी हो सकते हैं, और गैर-श्रेणी के xvalues cv- योग्य हो सकते हैं।
lvalue निम्नलिखित अभिव्यक्तियाँ lvalue अभिव्यक्तियाँ हैं:
एक चर, एक फ़ंक्शन, या एक डेटा सदस्य का नाम, प्रकार की परवाह किए बिना, जैसे std :: cin या std :: endl। यहां तक कि अगर चर के प्रकार का संदर्भ संदर्भ है, तो इसके नाम से संबंधित अभिव्यक्ति एक लवल्यू अभिव्यक्ति है; एक फ़ंक्शन कॉल या एक अतिभारित ऑपरेटर अभिव्यक्ति, जिसका वापसी प्रकार lvalue संदर्भ है, जैसे std :: getline (std :: cin, str), std :: cout << 1, str1 = str2, या ++ it; a = b, a + = b, a% = b, और अन्य सभी अंतर्निहित असाइनमेंट और कंपाउंड असाइनमेंट एक्सप्रेशन; ++ a और --a, बिल्ट-इन प्री-इन्क्रीमेंट और प्री-डिक्रीमेंट एक्सप्रेशन; * पी, अंतर्निहित अप्रत्यक्ष अभिव्यक्ति; एक [एन] और पी [एन], बिल्ट-इन सबस्क्रिप्ट अभिव्यक्तियों को छोड़कर, जहां एक एरे रिवेल्यू है (सी 11 11 के बाद से); एम, ऑब्जेक्ट एक्सप्रेशन का सदस्य, जहां मी सदस्य एन्यूमरेटर या गैर-स्थैतिक सदस्य फ़ंक्शन है, को छोड़कर या जहां एक rvalue और m गैर-संदर्भ प्रकार का एक गैर-स्थैतिक डेटा सदस्य है; p-> मी, पॉइंटर एक्सप्रेशन का बिल्ट-इन मेंबर, सिवाय इसके कि एम कहाँ मेंबर एन्यूमरेटर या नॉन-स्टैटिक मेंबर फंक्शन है; a। * mp, ऑब्जेक्ट एक्सप्रेशन के सदस्य के लिए पॉइंटर, जहां एक lvalue है और mp डेटा सदस्य के लिए एक पॉइंटर है; p -> * MP, बिल्ट-इन पॉइंटर से मेम्बर ऑफ़ पॉइंटर एक्सप्रेशन, जहाँ mp डेटा पॉइंटर का पॉइंटर है; ए, बी, बिल्ट-इन कॉमा अभिव्यक्ति, जहां बी एक लैवल्यू है; ए ? बी: सी, कुछ बी और सी (जैसे, जब दोनों एक ही प्रकार के अंतराल होते हैं, लेकिन विस्तार के लिए परिभाषा देखें) के लिए टर्नरी सशर्त अभिव्यक्ति; एक स्ट्रिंग शाब्दिक, जैसे "हैलो, दुनिया!"; संदर्भ प्रकार को स्थिर करने के लिए एक कास्ट एक्सप्रेशन, जैसे कि static_cast (x); एक फ़ंक्शन कॉल या एक अतिभारित ऑपरेटर अभिव्यक्ति, जिसका वापसी प्रकार कार्य करने के लिए संदर्भ है; फ़ंक्शन प्रकार, जैसे कि static_cast (x) के संदर्भ के संदर्भ में एक कास्ट एक्सप्रेशन। (C ++ 11 के बाद से) गुण:
नीचे के समान चमक (नीचे)। एक लेवल्यू का पता लिया जा सकता है: & ++ i 1
और & std :: एंडल वैध अभिव्यक्ति हैं। एक अंतर्निहित लैवल्यू का उपयोग बिल्ट-इन असाइनमेंट और कंपाउंड असाइनमेंट ऑपरेटर्स के बाएं हाथ के ऑपरेंड के रूप में किया जा सकता है। एक लैवल्यू का उपयोग एक लैवल्यू संदर्भ को इनिशियलाइज़ करने के लिए किया जा सकता है; यह अभिव्यक्ति द्वारा पहचाने गए ऑब्जेक्ट के साथ एक नया नाम जोड़ता है।
जैसा कि अगर नियम है
C ++ कंपाइलर को प्रोग्राम में किसी भी परिवर्तन को करने की अनुमति है, जब तक कि यह सही रहता है:
1) प्रत्येक अनुक्रम बिंदु पर, सभी अस्थिर वस्तुओं के मूल्य स्थिर होते हैं (पिछले मूल्यांकन पूर्ण होते हैं, नए मूल्यांकन शुरू नहीं हुए हैं) (C ++ 11 तक) 1) अस्थिर वस्तुओं तक पहुँच (पढ़ता और लिखता) शब्दार्थ के अनुसार सख्ती से होता है जिन भावों में वे घटित होते हैं। विशेष रूप से, वे एक ही धागे पर अन्य अस्थिर पहुंच के संबंध में पुन: व्यवस्थित नहीं होते हैं। (C ++ 11 के बाद से) 2) प्रोग्राम समाप्ति पर, फ़ाइलों को लिखे गए डेटा बिल्कुल वैसा ही है जैसे प्रोग्राम को लिखित रूप में निष्पादित किया गया था। 3) इनपुट के लिए प्रोग्राम का इंतजार करने से पहले इंटरेक्टिंग डिवाइस को भेजे गए टेक्स्ट को दिखाया जाएगा। 4) यदि ISO C प्रगम्मा #pragma STDC FENV_ACCESS समर्थित है और चालू है
यदि आप चश्मा पढ़ना चाहते हैं, तो मेरा मानना है कि ये वही हैं जिन्हें आपको पढ़ना चाहिए
संदर्भ
सी 11 मानक (आईएसओ / आईईसी 9899: 2011): 6.7.3 प्रकार के क्वालिफायर (पी: 121-123)
C99 मानक (ISO / IEC 9899: 1999): 6.7.3 प्रकार क्वालिफायर (पी: 108-110)
C89 / C90 मानक (ISO / IEC 9899: 1990): 3.5.3 प्रकार के क्वालिफायर