2012-07-03 6 views
34

क्या सी ++ 11 घोषणा में प्रारंभ होने पर गैर-स्थैतिक डेटा सदस्यों को 'ऑटो' घोषित करने की अनुमति देता है? उदाहरण के लिए: जबकि यह int x = 5; स्वीकार करतासी ++ 11 - गैर-स्थिर डेटा सदस्यों को 'ऑटो' के रूप में घोषित करना

struct S 
{ 
    auto x = 5; // in place of 'int x = 5;', which is definitely allowed 
}; 

जीसीसी 4.7 उपरोक्त कोड को खारिज कर दिया,।

मान लीजिए यह एक कंपाइलर बग नहीं है बल्कि मानक वास्तव में इसकी अनुमति नहीं देता है, क्यों नहीं? यह स्थानीय चर auto घोषित करने के रूप में उतना ही उपयोगी होगा।

+4

इस तरह एक स्थैतिक डेटा सदस्य घोषित करने की अनुमति है, लेकिन गैर-स्थैतिक डेटा सदस्य नहीं (सी ++ 11 §7.1.6.4 में अनुमत 'ऑटो' उपयोगों की सूची देखें। मेरे सिर के ऊपर से, मैं एक अच्छे कारण के बारे में नहीं सोच सकता कि यह क्यों प्रतिबंधित है, हालांकि मैं निश्चित रूप से इसे 'ऑटो' का दुरुपयोग मानता हूं। –

+0

@JamesMcNellis: आप इसे 'ऑटो' का दुरुपयोग क्यों मानेंगे? एक लंबे/जटिल प्रकार के नाम के साथ एक चर होने के बीच क्या अंतर है (ताकि यह अपने क्षेत्र को लिखने के बजाय 'ऑटो' का उपयोग करने के लिए वांछनीय है) कक्षा के दायरे बनाम स्थानीय क्षेत्र में एक है? – HighCommander4

+4

ब्लॉक स्कोप पर मुझे पता है कि चर कैसे _used_ किया जा रहा है। कक्षा के दायरे या नामस्थान क्षेत्र में, मुझे जरूरी नहीं है कि चर का उपयोग कैसे किया जा रहा है। उदाहरण के लिए, अधिक सामान्य 'ऑटो एक्स = एफ (ए, बी, सी);': मुझे सभी 'f() 'कार्यों को ढूंढना होगा और मेरे सिर में ओवरलोड रिज़ॉल्यूशन करना होगा 'x' का प्रकार। कम से कम स्थानीय दायरे में मैं देख सकता हूं कि 'x' के साथ क्या किया जा रहा है और इसका उपयोग किस प्रकार से करना है। 'ऑटो 'बेहद उपयोगी है, लेकिन इसका उपयोग _everywhere_ नहीं किया जाना चाहिए। –

उत्तर

51

गैर स्थिर सदस्यों पर रोक लगाने के लिए नियम 7.1.6.4 खंड 4:

ऑटो प्रकार-विनिर्देशक भी एक चयन बयान की हालत (6.4) में एक चर घोषित करने में इस्तेमाल किया जा सकता या पुनरावृत्ति-घोषणा में, और घोषणा में, (6.5), नई-प्रकार-आईडी में टाइप-विनिर्देशक-सीक में नई अभिव्यक्ति (5.3.4) की टाइप-आईडी में, और घोषित करने में एक स्थैतिक डेटा सदस्य एक श्रेणी परिभाषा (9.4.2) के सदस्य-विनिर्देश के भीतर दिखाई देने वाले ब्रेस-या-बराबर-प्रारंभकर्ता के साथ।

मुझे स्थिर here होने के लिए तर्क मिला जो दर्शाता है कि जेम्स मैकनेलिस ने टिप्पणी में यह कैसे बताया।

एक राष्ट्रीय निकाय गैर स्टैटिक्स के लिए स्वत: प्रकार-विनिर्देशक की इजाजत दी नापसंद। लेखकों के लिए एक ई-मेल से:

template< class T > 
    struct MyType : T { 
     auto data = func(); 
     static const size_t erm = sizeof(data); 
    }; 

आदेश एक्स के लेआउट निर्धारित करने के लिए, अब हम 2 चरण नाम देखने और ADL है। ध्यान दें कि func या तो एक प्रकार या एक समारोह हो सकता है; यह टी में पाया जा सकता है, माईटाइप का नामस्थान, संबंधित तत्काल, वैश्विक नामस्थान, अज्ञात नेमस्पेस, या किसी भी नेमस्पेस का उपयोग निर्देश के अधीन टी के नामस्थान (टी) से संबंधित हो सकता है। देखभाल के साथ हम शायद भाग्य के लिए कुछ concept_map लुकअप फेंक सकते हैं। हेडर समावेशन के आदेश के आधार पर मुझे एडीएल के लिए अलग-अलग परिणाम भी मिल सकते हैं, और एक परिभाषा नियम तोड़ सकते हैं - जो निदान की आवश्यकता नहीं है।

इस विवाद के कारण, लेखक अब प्रस्ताव नहीं देते हैं कि ऑटो गैर-स्थैतिक डेटा सदस्यों के लिए अनुमति दी जाए।

तो, मूल रूप से हेडर समावेशन के आदेश के आधार पर, data का प्रकार बहुत अलग हो सकता है। बेशक, auto x = 5; को 2-चरण नाम लुकअप या एडीएल पर निर्भर रहने की आवश्यकता नहीं होगी, हालांकि, मुझे लगता है कि उन्होंने इसे "कंबल" नियम बना दिया है, अन्यथा, उन्हें प्रत्येक उपयोग के मामले के लिए व्यक्तिगत नियम बनाना होगा चीजें बहुत जटिल बनाओ।

उसी पेपर में, लेखक इस प्रतिबंध को समाप्त करने का प्रस्ताव करता है, हालांकि, ऐसा लगता है कि यह प्रस्ताव शायद उपर्युक्त तर्क के कारण अस्वीकार कर दिया गया है और यह भी कि अपेक्षित व्यवहार वही हो सकता है चाहे प्रारंभकर्ता क्या हो।

+5

इसे खोदने के लिए धन्यवाद, यह एक दिलचस्प तर्क है! – HighCommander4

+2

एनबी इसे अनुमति देने का मूल प्रस्ताव [N2426] था (http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2426.htm) –

+1

@ जोनाथन वाकई वास्तव में उस विषय को देखने की कोई उम्मीद नहीं है सी ++ 20 के लिए पुनरुत्थान का कहना है? मेरे कोड में कई जगहें हैं जो इसे अनुमति देने पर अधिक पठनीय होगी। अधिकतर 'auto foo_ = टाइप {...};', तो बस वह मामला पहले से ही मदद करेगा। – akim

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