2016-06-26 14 views
11

उदाहरण के लिए, मैं एक बहुआयामी सरणीके लिए है (ऑटो और ए: ए) व्याकरणिक रूप से सही?

array<array<array<int, 3>, 4>, 5> a; 

परिभाषित और मैं पाश यह

for (auto& a : a) 
    for (auto& a : a) 
     for (auto& a : a) 
      a = 1; 

है कि व्याकरण में है ना? मैंने वीएस2015 में परीक्षण किया। कोई संकलन त्रुटियां नहीं।

+0

@Resurrection के बराबर है: क्योंकि यह संकलन नहीं है 'ए' की घोषणा में '<' and '>' का मिलान किया गया। इसे ठीक करने के बाद, इसे संकलित करना चाहिए क्योंकि यह कानूनी है (उदाहरण के लिए क्लैंग इसे स्वीकार करता है)। –

+0

@BenVoigt मैंने इसे देखा और सही किया है लेकिन यह अभी भी पुनर्वितरण त्रुटि के साथ VS2015 में संकलित नहीं है। संपादित करें: ठीक है, कभी नहीं, मेरे पास 'ए' नामक एक और चर था। वैसे यह भ्रमित था! – Resurrection

उत्तर

18

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

सी ++ 11 श्रेणी-के लिए एक स्रोत परिवर्तन के रूप में परिभाषित किया गया है, जो एक आंतरिक दायरे में रेंज चर की परिभाषा रखता है, और उस दायरे के बाहर रेंज अभिव्यक्ति का मूल्यांकन करता है।

धारा 6.5.4 का कहना है कि

रेंज आधारित बयान के लिए

for (for-range-declaration : for-range-initializer) statement 

{ 
    auto &&__range = for-range-initializer ; 
    auto __begin = begin-expr ; 
    auto __end = end-expr ; 
    for (; __begin != __end; ++__begin) { 
     for-range-declaration = *__begin; 
     statement 
    } 
} 
+0

तो मुझे कई अस्थायी नामों की आवश्यकता है, पठनीय भी नहीं। कोई बेहतर तरीका? – user1899020

+0

यदि आपने अच्छे नाम चुने हैं तो यह पठनीय होगा। मेरी गलती नहीं है आप multicharacter चर नाम टाइप करने के लिए बहुत आलसी हैं। –

+0

क्या वे * पूरी तरह से समकक्ष हैं? क्या मुझे उन आंतरिक चर को संशोधित करने की अनुमति है? – HolyBlackCat

6

हाँ, यह कारण है कि क्योंकि a आप में घोषित पाश के लिए खाल मूल सरणी a है :)

:

for (auto& a : a) 
      ^^^ ^^^^^^^^^ 
      hides this 'a' (the original array) 

और फिर, यह सब फिर से सिर्फ एक ही है ।

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