decltype
का मानकीकरण प्रयास कई वर्षों तक फैला हुआ एक कठिन प्रयास था। समिति ने आखिरकार इसे स्वीकार करने से पहले इस पेपर के 7 संस्करण थे। संस्करणों थे:
उल्लेखनीय है, व्यवहार के बीज है जो आप सवाल बहुत पहले संशोधन में कर रहे हैं: N1478 है, जो के लिए की जरूरत का परिचय "typeof के दो प्रकार:। या तो संरक्षित करने के लिए या प्रकार में संदर्भ ड्रॉप करने के लिए"
इस पत्र संदर्भ के संरक्षण संस्करण के लिए एक औचित्य, इस उद्धरण सहित देने के लिए पर चला जाता है:
दूसरी ओर, संदर्भ-छोड़ने अर्थ विज्ञान वास्तव में वापसी व्यक्त करने के लिए एक तंत्र प्रदान करने में विफल रहता सामान्य फ़ंक्शंस के प्रकार, जैसा कि स्ट्रॉस-ट्रुप [स्ट्र02] द्वारा प्रदर्शित किया गया है। इसका तात्पर्य है कि एक संदर्भ-ड्रॉप प्रकार से जेनेरिक पुस्तकालयों के लेखकों के लिए समस्याएं पैदा होंगी।
इन कागजात के माध्यम से पढ़ने के लिए कोई विकल्प नहीं है। हालांकि कोई सारांश दे सकता है कि decltype
दो उद्देश्यों को पूरा करता है:
- पहचानकर्ता के घोषित प्रकार की रिपोर्ट करने के लिए।
- अभिव्यक्ति के प्रकार की रिपोर्ट करने के लिए।
दूसरे उपयोग के मामले के लिए, याद रखें कि अभिव्यक्ति कभी भी संदर्भ प्रकार नहीं हैं, बल्कि इसके बजाय अंतराल, xvalues, या prvalues में से एक हैं। सम्मेलन के अनुसार, जब decltype
एक लेल्यू अभिव्यक्ति के प्रकार की रिपोर्ट कर रहा है, तो यह एक lvalue संदर्भ टाइप करता है, और जब अभिव्यक्ति एक xvalue है, तो रिपोर्ट प्रकार एक रैल्यू संदर्भ बन जाता है।
आपके उदाहरण में, *ap
एक अभिव्यक्ति है, जबकि a
एक पहचानकर्ता है। तो आपका उदाहरण दोनों उपयोग मामलों का उपयोग करता है, जैसा कि पहले N1478 में पेश किया गया था।
यह भी ध्यान देने योग्य है कि decltype
अलगाव में डिज़ाइन नहीं किया गया था। शेष सी ++ भाषा इस समय अवधि (जैसे रावल संदर्भ) के दौरान विकसित हो रही थी, और decltype
के डिजाइन को गति रखने के लिए पुनरावृत्त किया गया था।
यह भी ध्यान रखें कि एक बार decltype
प्रस्ताव स्वीकार कर लिया गया था, यह जारी रहा (और इस दिन जारी है) विकसित हुआ। समस्याओं की सूची देखें:
http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_index.html
विशेष रूप से खंड 7.1.6.2 (जो खंड है, जहां decltype
विनिर्देश जीवन का थोक)।
मुझे लगता है कि आप इसे पहले ही जानते हैं :), लेकिन रिकॉर्ड के लिए आप इसे 'std :: remove_reference' या 'std :: remove_pointer' का उपयोग करके संशोधित कर सकते हैं। – 101010
@ 40two, हाँ मुझे उन उपयोगिताओं के बारे में पता है। मैं समझने की कोशिश कर रहा हूं कि भाषा को इस तरह परिभाषित क्यों किया जाता है। –
मुझे पता था कि आप इसे जानते हैं क्योंकि आप इन परिसर में एक सामान्य संदिग्ध हैं। मुख्य कारण जो मैं सोच सकता हूं, पिछली वापसी में 'decltype' के उपयोग के लिए है। मुझे लगता है कि पीछे से पीछे की वापसी में '&' को हटाने से असुविधाजनक होगा। – 101010