2013-01-02 11 views
19

दो प्रश्न:decltype और typeof के बीच अंतर? <code>decltype</code> और <code>typeof</code> के बारे में

  • वहाँ decltype और typeof ऑपरेटरों के बीच कोई अंतर है?
  • क्या typeof सी ++ 11 में अप्रचलित हो गया है?
+16

ध्यान रखें 'typeof' कभी नहीं मानक था। – GManNickG

+6

एक मौजूद है, दूसरा यह नहीं है :-) यह भी ध्यान दें कि 'decltype' में अच्छी तरह से परिभाषित और रोचक अर्थशास्त्र है जो आपको एक सामान्य सेटिंग में 'decltype (x) &&' जैसे कुछ कहने की अनुमति देता है। –

उत्तर

19

c++ में कोई typeof ऑपरेटर नहीं है। हालांकि यह सच है कि कुछ समय के लिए अधिकांश कंपेलरों द्वारा ऐसी कार्यक्षमता की पेशकश की गई है, यह हमेशा एक कंपाइलर विशिष्ट भाषा विस्तार रहा है। इसलिए सामान्य रूप से दोनों के व्यवहार की तुलना करना समझ में नहीं आता है, क्योंकि typeof (यदि यह भी मौजूद है) का व्यवहार अत्यंत मंच निर्भर है।

चूंकि अब हमारे पास एक चर/अभिव्यक्ति के प्रकार का एक मानक तरीका है, इसलिए वास्तव में गैर पोर्टेबल एक्सटेंशन पर भरोसा करने का कोई कारण नहीं है, इसलिए मैं कहूंगा कि यह बहुत अप्रचलित है।

एक और बात पर विचार करना चाहिए (यानी अगर व्यवहार typeof की है यह संभव है कि typeof विस्तार भविष्य में नई भाषा सुविधाओं समाहित करने के लिए ज्यादा विकास नहीं मिलेगा किसी दिए गए संकलक के लिए decltype साथ संगत नहीं है है यह शायद lambdas के साथ काम नहीं कर सकता है)। मुझे नहीं पता कि वर्तमान में यह मामला है या नहीं, लेकिन यह एक अलग संभावना है।

+1

'टाइपटाइप' के कारण यह काफी अप्रचलित नहीं है, क्योंकि 'टाइपोफ' (जीसीसी, ईडीजी, मेट्रोर्क्स में) के अर्थशास्त्र को छोड़ने के संदर्भ में उस प्रकार के स्थानीय चर घोषित करने के लिए उपयोगी था। हालांकि, जब 'ऑटो' के साथ भी जोड़ा जाता है, तो यह अब बहुत अनावश्यक है। यह दुख की बात है कि मौजूदा कार्यान्वयन मतभेदों के कारण हम आदर्श नाम 'टाइपोफ' ('alignof', 'sizeof' के साथ rhymes) का उपयोग नहीं कर सका। –

1

टाइपऑफ को मानकीकृत नहीं किया गया है, हालांकि इसे कई कंपाइलर विक्रेताओं द्वारा लागू किया गया था, उदाहरण के लिए, GCC। यह decltype के साथ अप्रचलित हो गया।

टाइपफ़ोम की कमियों के लिए एक अच्छी व्याख्या in this related answer मिल सकती है।

6

दोनों के बीच का अंतर यह है कि decltype हमेशा जानकारी के हिस्से के रूप में संदर्भों को संरक्षित करता है, जबकि typeof नहीं हो सकता है। तो ...

int a = 1; 
int& ra = a; 
typeof(a) b = 1;  // int 
typeof(ra) b2 = 1; // int 
decltype(a) b3;  // int 
decltype(ra) b4 = a; // reference to int 

नाम typeof पसंदीदा विकल्प (sizeof और alignof, और पहले से ही एक्सटेंशन में प्रयोग किया जाता नाम के साथ संगत) था, लेकिन आप प्रस्ताव N1478, मौजूदा कार्यान्वयन के साथ संगतता के चारों ओर चिंता में देख सकते हैं संदर्भों को छोड़ने से उन्हें एक अलग नाम देने का मौका मिला।

"सामान्य रूप से अभिव्यक्ति के प्रकार की पूछताछ के लिए तंत्र का जिक्र करते समय हम ऑपरेटर नाम टाइपफ़ का उपयोग करते हैं। Decltype ऑपरेटर टाइपफ के प्रस्तावित संस्करण को संदर्भित करता है ... कुछ कंपाइलर विक्रेता (ईडीजी, मेट्रोवर्क्स, जीसीसी) संदर्भ-ड्रॉपिंग सेमेन्टिक्स के साथ एक प्रकार के ऑपरेटर के रूप में एक प्रकार के ऑपरेटर प्रदान करें। जैसा कि धारा 4 में वर्णित है, यह चर के प्रकार को व्यक्त करने के लिए आदर्श प्रतीत होता है। दूसरी तरफ, संदर्भ-छोड़ने वाले अर्थशास्त्र वास्तव में अभिव्यक्त करने के लिए एक तंत्र प्रदान करने में विफल रहता है जेनेरिक कार्यों के रिटर्न प्रकार ... इस प्रस्ताव में, ऑपरेटर के अर्थशास्त्र जो अभिव्यक्ति के प्रकार की जानकारी प्रदान करते हैं, घोषित प्रकार को दर्शाता है। इसलिए, हम ऑपरेटर को घोषित करने का प्रस्ताव देते हैं। "

जे। जर्वी, बी स्ट्रॉस्ट्रप, डी। ग्रेगोर, जे। सेक: डेक्टाइप और ऑटो। N1478/03-0061।

तो यह कहना है कि decltype पूरी तरह से typeof नहीं रही है (यदि आप संदर्भ छोड़ने अर्थ विज्ञान चाहते हैं, तो उन compilers में typeof विस्तार अभी भी प्रयोग किया है), बल्कि, typeof काफी हद तक यह प्लस auto द्वारा नहीं रही थी, जो ड्रॉप करता है गलत है संदर्भ और प्रतिस्थापन का उपयोग करता है जहां typeof परिवर्तनीय अनुमान के लिए उपयोग किया गया था।

0

अच्छा, typeof एक गैर-मानक जीएनयू सी एक्सटेंशन है जिसे आप जीएनयू सी ++ में उपयोग कर सकते हैं क्योंकि जीसीसी आपको अन्य भाषाओं में अन्य भाषाओं (विशेष रूप से नहीं) की सुविधाओं का उपयोग करने की अनुमति देता है, इसलिए उन्हें वास्तव में तुलना नहीं की जानी चाहिए।

बेशक अन्य गैर-मानक एक्सटेंशन अन्य कंपाइलरों के लिए मौजूद हो सकते हैं, लेकिन जीसीसी निश्चित रूप से सबसे व्यापक रूप से दस्तावेज़ीकृत कार्यान्वयन है।

प्रश्न का उत्तर देने के लिए: यदि यह कभी सुविधा नहीं थी तो इसे अप्रचलित नहीं किया जा सकता है।

यदि आप सी ++ में किसी भी विधि की योग्यता की तुलना करना चाहते हैं तो जब तक आप संदर्भों से निपट नहीं रहे हैं तब तक कोई अंतर नहीं है। आपको decltype का उपयोग करना चाहिए क्योंकि यह पोर्टेबल और मानक अनुरूप है।

3

विरासत कोड के लिए, मैं सफलतापूर्वक उपयोग किया गया है निम्नलिखित:

#include <type_traits> 
#define typeof(x) std::remove_reference<decltype((x))>::type 
+0

अतिरिक्त '()' s क्यों? 'Decltype (x)' और 'decltype ((x)) के बीच का अंतर आमतौर पर केवल अतिरिक्त '' है, जिसे आप किसी भी तरह से हटाने के लिए आगे बढ़ते हैं? या क्या मैं कुछ न कुछ भूल रहा हूं? – Yakk

+0

अतिरिक्त कोष्ठक पैरामीटर एक्स में असीमित कॉमा के खिलाफ रक्षा के लिए हैं, हालांकि गिरावट के मामले में केवल एक खतरा होगा। उनके लिए जरूरी है – user377178

+2

आपको '...' और '__VA_ARGS__' या 'बॉब ' की भी आवश्यकता होगी क्योंकि एक तर्क के रूप में सी प्रीप्रोसेसर द्वारा सही ढंग से पार्स नहीं किया जाएगा। – Yakk

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