2010-01-27 13 views
8

प्रकार T की एक वस्तु को प्रारंभ मूल्य तय करने के एक निम्न में से एक की तर्ज पर कुछ करना होगा प्रकार विनिर्देशक, जैसे, unsigned int:स्पष्ट प्रकार रूपांतरण और एकाधिक सरल प्रकार विनिर्देशक

unsigned int x = unsigned int(); 
unsigned int x((unsigned int())); 

विजुअल C++ 2008 और इंटेल सी ++ संकलक 11.1 बिना चेतावनी के इन दोनों को स्वीकार करते हैं; Comau 4.3.10.1b2 और g ++ 3.4.5 (जो स्वीकार्य रूप से, विशेष रूप से हाल ही में नहीं) है।

सी ++ मानक के अनुसार (सी ++ 03 5.2.3/2, expr.type.conv):

अभिव्यक्ति T(), जहां T एक सरल प्रकार-विनिर्देशक है (7.1.5.2) एक गैर सरणी पूरा ऑब्जेक्ट प्रकार या (संभवतः सीवी-योग्य) void प्रकार के लिए, निर्दिष्ट प्रकार का एक rvalue है, जो मूल्य-प्रारंभ

7.1.5.2 कहते हैं, "सरल प्रकार विनिर्देशक हैं बनाता है , "और एक सूची के साथ अनुसरण करता है जिसमें unsigned और int शामिल हैं।

इसलिए, दिए गए 5.2.3/2, "सरल प्रकार-विनिर्देशक" में विलक्षण है, और unsigned और int दो प्रकार विनिर्देशक कि उपयोग उपरोक्त उदाहरण unsigned int अमान्य हैं कर रहे हैं,?

यह सवाल किसी और चीज से जिज्ञासा से बाहर अधिक है (और, यदि हां, फॉलोअप है, यह माइक्रोसॉफ्ट और इंटेल का समर्थन करने के लिए गलत भाव कहा है?); एकाधिक सरल प्रकार विनिर्देशकों के संयोजन द्वारा निर्दिष्ट सभी प्रकार के लिए, मान प्रारंभिक शून्य प्रारंभिक के बराबर है। (यह प्रश्न comments in response to this answer to a question about initialization द्वारा प्रेरित किया गया था)।

+0

आप मुझसे कैसे हिम्मत करते हैं। : 3 मुझे लगता है कि अभिव्यक्ति '(हस्ताक्षरित int)' एक प्रकार का नाम है, हालांकि। – GManNickG

+0

@GMan: '(हस्ताक्षरित int)()' जीसीसी 3 और 4 के साथ विफल रहता है और वीसी 8 के साथ भी। 'typedef'ed संस्करण निश्चित रूप से काम करते हैं। –

+0

एच मीटर। :( – GManNickG

उत्तर

8

मैं posted this question to comp.lang.c++.moderated:

एक ही तरह प्रकार के लिए लागू होता है।

डैनियल सी ++ मानक समिति की Krügler व्याख्या से सहमत थे कि unsigned int सरल प्रकार विनिर्देशक के संयोजन है, और अपने आप में एक सरल प्रकार निर्दिष्टकर्ता नहीं है।

तालिका 7 referenced by Jerry Coffin के शीर्षक के संबंध में, Krügler का कहना है:

मैं मानता हूँ कि टेबल 7 (जो सबसे हाल मसौदा N3000 में टेबल 9) के शीर्षक कुछ भ्रामक है, लेकिन पूर्ववर्ती [dcl.type.simple] में/2 पाठ मेरे लिए बहुत स्पष्ट लग रहा है, जब यह कहते हैं:।

टेबल 7 सरल प्रकार-विनिर्देशक और प्रकार वे निर्दिष्ट की मान्य संयोजनों को सारांशित "

(मैं क्षमा चाहता हूं कि इसे यहां वापस न्यूज ग्रुप से पोस्ट करने में इतना समय लगेगा; यह पूरी तरह से मेरे दिमाग फिसल गया)

1

हम्म, कभी कभी आप एक typedef की जरूरत है। यदि यह नहीं कहता कि निदान की आवश्यकता है, तो उनके लिए इसका समर्थन करना गलत नहीं है। फिर भी, पोर्टेबिलिटी के लिए, आप एक typedef (uint16_t या uint64_t, हालांकि उन सही नहीं हो सकता है) का उपयोग कर सकते हैं, या एक टेम्पलेट के साथ typename बोली:

iterator<void, unsigned long>::value_type(5) 

कैसे अनुचित रूप से अत्यधिक शब्द के लिए कि क्या है?

संपादित करें: ओह, या बस 5ul। यह unsigned short, unsigned char, और signed char छोड़ देता है, केवल एक ही प्रकार के रूप में आप आसानी से स्पष्ट रूप से निर्माण नहीं कर सकते हैं।

+0

मेरे पास होगा: 'टेम्पलेट स्ट्रक्चर समान_ टाइप {टाइपपीफ टी टाइप;}; ', थोड़ा आसान। – GManNickG

+0

मेरे पास न तो होगा; v)। मैंने बस एसटीएल में कुछ सोचने की कोशिश की। पहचान टेम्पलेट और पहचान फिक्स्चर को छोड़ने से मुझे हमेशा परेशान होता है। – Potatoswatter

+0

आप सहीता के मुद्दे के बारे में सही हैं। "एक अनुरूप कार्यान्वयन में एक्सटेंशन हो सकते हैं ... बशर्ते वे किसी भी अच्छी तरह से गठित कार्यक्रम के व्यवहार को परिवर्तित न करें" (1.4/8, intro.compliance); मैं भाषा व्याकरण, विस्तार और अनुपालन से संबंधित नियमों को भूल गया था। –

1

§7.1.5.2 में, तालिका 7, जो क्या एक सरल विनिर्देशक के रूप में दी जाने वाली अनुमति की पूरी सूची (जो "अहस्ताक्षरित int" शामिल नहीं है) है करने के लिए नीचे पढ़ते रहें।

+3

मैं कहना चाहता हूँ तालिका "सरल प्रकार विनिर्देशक" की धारणा को परिभाषित करने का इरादा नहीं है। इसके अलावा, तालिका के बाद शब्द "एकाधिक सरल प्रकार विनिर्देशक" का उल्लेख करता है। यह वह शब्द है जो हमें 'हस्ताक्षरित int' और 'int unsigned 'का उपयोग करने की अनुमति देता है, जिसका अर्थ है कि' हस्ताक्षरित int' वास्तव में * एकाधिक * सरल प्रकार विनिर्देशक है। – AnT

+0

@AndreyT: यह मेरी व्याख्या भी थी। मुझे यह भी लगता है कि तालिका कॉलम का शीर्षलेख, "निर्दिष्टकर्ता" का अर्थ बहुत अधिक है। –

+0

हम्म ... मानक की मेरी प्रति में, तालिका का शीर्षक "सरल प्रकार विनिर्देशक और वे निर्दिष्ट प्रकार हैं।" उस शीर्षक के साथ, यह विश्वास करने के लिए एक भयानक खिंचाव की तरह लगता है कि तालिका में कुछ * एक साधारण प्रकार का विशिष्ट नहीं है। –

-2

7.1.5.2:

सरल प्रकार-विनिर्देशक या तो किसी पूर्व-घोषित उपयोगकर्ता परिभाषित प्रकार या मौलिक types`

इसका मतलब है कि unsigned int i = unsigned int() कानूनी है में से एक निर्दिष्ट करते हैं, के बाद से unsigned int एक मौलिक प्रकार है (और इस प्रकार एक सरल प्रकार-विनिर्देशक, 3.9.1 देखें)।

long double 
long long 
long long int 
unsigned long 
unsigned long long int 
short int 
... 
+0

मुझे लगता है कि यहां एक तार्किक झूठ है: आपका तर्क यह है कि, "यदि टी एक साधारण प्रकार का विनिर्देशक है, तो टी या तो पहले परिभाषित उपयोगकर्ता परिभाषित प्रकार है या टी मौलिक प्रकारों में से एक है। टी एक मौलिक प्रकार है, इसलिए टी एक साधारण प्रकार का विशिष्ट है "(आप परिणामस्वरूप पुष्टि कर रहे हैं)। –

+0

@James: मैं समझता हूँ तुम क्या कह रहे न, आपके सवाल ने कहा कि 'टी टी = टी()' सरल प्रकार-विनिर्देशक के लिए कानूनी है, और मेरी बोली का कहना है कि मूल प्रकारों, सरल प्रकार विनिर्देशक हैं तो 'अहस्ताक्षरित int i = हस्ताक्षरित int() 'कानूनी है। – smerlin

+1

मैं क्षमा चाहता हूं; जब मैंने आज सुबह पोस्ट किया तो मुझे स्पष्ट रूप से पर्याप्त कॉफी नहीं मिली थी। मैं आपकी व्याख्या से असहमत हूं कि यदि 'टी' एक मौलिक प्रकार है, तो 'टी' को एक साधारण प्रकार का विनिर्देश भी होना चाहिए। मेरा मानना ​​है कि वास्तव में 'टी' कई सरल प्रकार के विनिर्देशक हो सकते हैं (उदा।' हस्ताक्षरित int 'एक मौलिक प्रकार है लेकिन दो सरल प्रकार के विनिर्देशकों,' हस्ताक्षरित 'और' int') द्वारा नामित किया गया है। मुझे लगता है कि इसका समर्थन करने के लिए बहुत सारे कथन हैं, उदा। 3.9.1, नोट 40: "प्रकार और विनिर्देशों के _sequences_ के बीच पत्राचार के संबंध में 7.1.5.2 देखें जो उन्हें निर्दिष्ट करते हैं" (जोर मेरा) –

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