2012-05-25 10 views
598

मुझे पता है कि सी ++ 11 में हम अब using उपयोग कर सकते हैं प्रकार उर्फ ​​लिखने के typedef तरह,:सी ++ 11 में 'टाइपपीफ' और 'उपयोग' के बीच क्या अंतर है?

typedef int MyInt; 

है, मैं क्या समझ से, बराबर करने के लिए:

using MyInt = int; 

और वह नई वाक्य रचना प्रयास से उभरा "template typedef" व्यक्त करने के लिए एक तरह से करने के लिए:

template< class T > using MyType = AnotherType< T, MyAllocatorType >; 

लेकिन पहले दो गैर-टी के साथ, emplate उदाहरण, मानक में कोई अन्य सूक्ष्म मतभेद हैं? उदाहरण के लिए, typedef एस "कमजोर" तरीके से अलियासिंग करते हैं। यही वह नया प्रकार नहीं बनाता है लेकिन केवल एक नया नाम (रूपांतरण उन नामों के बीच निहित है)।

क्या यह using के साथ समान है या यह एक नया प्रकार उत्पन्न करता है? क्या कोई अंतर है?

+145

मैं व्यक्तिगत रूप से नई वाक्य रचना पसंद करते हैं क्योंकि यह बहुत अधिक नियमित रूप से चर काम के समान है, पठनीयता में सुधार काफी हद तक एक ही कर रहे हैं। उदाहरण के लिए, क्या आप 'टाइपिफ शून्य (& MyFunc) (int, int);' या 'MyFunc = void (int, int) का उपयोग करते हैं; '? –

+3

मैं पूरी तरह से सहमत हूं, मैं केवल नए सिंटैक्स का उपयोग करता हूं। यही कारण है कि मैं यह सुनिश्चित करने के लिए कह रहा था कि वास्तव में कोई अंतर नहीं है। – Klaim

+56

@MatthieuM। वे दो अलग बीटीडब्ल्यू हैं। यह 'typedef शून्य MyFunc (int, int) होना चाहिए; '(जो वास्तव में बुरा नहीं दिखता है), या' MyFunc = void (&) (int, int) का उपयोग करना;' –

उत्तर

401

वे बराबर हैं, मानक (जोर मेरा) से (7.1.3.2):

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

+14

उत्तर से, 'उपयोग' कीवर्ड 'typedef' का सुपरसैट प्रतीत होता है। फिर, भविष्य में 'typdef' को बहिष्कृत किया जाएगा? – iammilind

+0

यह स्पष्ट करता है। – Klaim

+4

@iammilind शायद नहीं, लेकिन आप कोड कर सकते हैं जैसे कि यह थे। – bames53

139

सिंटैक्स का उपयोग टेम्पलेट के भीतर उपयोग किए जाने पर एक लाभ होता है। यदि आपको टाइप एब्स्ट्रक्शन की आवश्यकता है, लेकिन भविष्य में निर्दिष्ट होने के लिए टेम्पलेट पैरामीटर को भी संभव रखने की आवश्यकता है। आपको ऐसा कुछ लिखना चाहिए।

template <typename T> struct whatever {}; 

template <typename T> struct rebind 
{ 
    typedef whatever<T> type; // to make it possible to substitue the whatever in future. 
}; 

rebind<int>::type variable; 

template <typename U> struct bar { typename rebind<U>::type _var_member; } 

लेकिन सिंटैक्स का उपयोग उपयोग के इस मामले सरल करता है।

template <typename T> using my_type = whatever<T>; 

my_type<int> variable; 
template <typename U> struct baz { my_type<U> _var_member; } 
+20

हालांकि मैंने पहले ही इस सवाल में इसकी ओर इशारा किया है। मेरा सवाल यह है कि यदि आप टेम्पलेट का उपयोग नहीं करते हैं तो टाइपपीफ के साथ कोई अंतर है। उदाहरण के लिए, जब आप 'Foo foo {init_value} का उपयोग करते हैं;' 'फू फू (init_value)' के बजाय दोनों को एक ही काम करना चाहिए, लेकिन बिल्कुल वही नियमों को ठीक न करें। तो मैं सोच रहा था कि क्या/typedef का उपयोग करने के साथ एक समान छुपा अंतर था। – Klaim

101

वे सिवाय इसके कि

The alias declaration is compatible with templates, whereas the C style typedef is not.

+12

विशेष रूप से उत्तर की सादगी का शौक और टाइपसेट की उत्पत्ति को इंगित करना। – g24l

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