2014-09-28 7 views
5

C++ से ड्राफ्ट स्टैंडर्ड N3337:decltype के व्यवहार ने जिस तरह से परिभाषित किया है?

7.1.6.2 सरल प्रकार विनिर्देशक

4 प्रकार decltype(e) से दर्शाया जाता है इस प्रकार परिभाषित किया गया है:

- अगर e एक unparenthesized ID- है अभिव्यक्ति या एक अप्रतिबंधित वर्ग सदस्य पहुंच (5.2.5), decltype(e)e द्वारा नामित इकाई का प्रकार है। अगर ऐसी कोई इकाई नहीं है, या e ओवरलोडेड फ़ंक्शंस का एक सेट नाम देती है, तो प्रोग्राम खराब बना हुआ है;

- अन्यथा, अगर ई एक XValue है, decltype(e)T&&, जहां Te के प्रकार है;

- अन्यथा, अगर ई एक lvalue है, decltype(e)T&, जहां Te के प्रकार है;

कुछ दस्तावेज़ बताते हैं, क्यों decltype(*ap) सिर्फ int नहीं हो सकता था के लिए

अगर मैं सही ढंग से ऊपर समझते हैं,

int a; 
decltype(a) b = 10; // type of b is int 

int* ap; 
decltype(*ap) c = 10; // Does not work since type of c is int& 

आप व्याख्या कर सकते हैं, या बिंदु?

+0

मुझे लगता है कि आप इसे पहले ही जानते हैं :), लेकिन रिकॉर्ड के लिए आप इसे 'std :: remove_reference' या 'std :: remove_pointer' का उपयोग करके संशोधित कर सकते हैं। – 101010

+0

@ 40two, हाँ मुझे उन उपयोगिताओं के बारे में पता है। मैं समझने की कोशिश कर रहा हूं कि भाषा को इस तरह परिभाषित क्यों किया जाता है। –

+0

मुझे पता था कि आप इसे जानते हैं क्योंकि आप इन परिसर में एक सामान्य संदिग्ध हैं। मुख्य कारण जो मैं सोच सकता हूं, पिछली वापसी में 'decltype' के उपयोग के लिए है। मुझे लगता है कि पीछे से पीछे की वापसी में '&' को हटाने से असुविधाजनक होगा। – 101010

उत्तर

6

decltype का मानकीकरण प्रयास कई वर्षों तक फैला हुआ एक कठिन प्रयास था। समिति ने आखिरकार इसे स्वीकार करने से पहले इस पेपर के 7 संस्करण थे। संस्करणों थे:

उल्लेखनीय है, व्यवहार के बीज है जो आप सवाल बहुत पहले संशोधन में कर रहे हैं: N1478 है, जो के लिए की जरूरत का परिचय "typeof के दो प्रकार:। या तो संरक्षित करने के लिए या प्रकार में संदर्भ ड्रॉप करने के लिए"

इस पत्र संदर्भ के संरक्षण संस्करण के लिए एक औचित्य, इस उद्धरण सहित देने के लिए पर चला जाता है:

दूसरी ओर, संदर्भ-छोड़ने अर्थ विज्ञान वास्तव में वापसी व्यक्त करने के लिए एक तंत्र प्रदान करने में विफल रहता सामान्य फ़ंक्शंस के प्रकार, जैसा कि स्ट्रॉस-ट्रुप [स्ट्र02] द्वारा प्रदर्शित किया गया है। इसका तात्पर्य है कि एक संदर्भ-ड्रॉप प्रकार से जेनेरिक पुस्तकालयों के लेखकों के लिए समस्याएं पैदा होंगी।

इन कागजात के माध्यम से पढ़ने के लिए कोई विकल्प नहीं है। हालांकि कोई सारांश दे सकता है कि decltype दो उद्देश्यों को पूरा करता है:

  1. पहचानकर्ता के घोषित प्रकार की रिपोर्ट करने के लिए।
  2. अभिव्यक्ति के प्रकार की रिपोर्ट करने के लिए।

दूसरे उपयोग के मामले के लिए, याद रखें कि अभिव्यक्ति कभी भी संदर्भ प्रकार नहीं हैं, बल्कि इसके बजाय अंतराल, 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 विनिर्देश जीवन का थोक)।

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