2015-10-23 8 views
30

मैं सी ++ के लिए नया हूँ, और मैं इस बारे में उलझन में हूँ:क्यों कथन के लिए संदर्भ कॉन्स्ट को फिर से असाइन किया जा सकता है?

vector<int> v = { 1,2 }; 
const int &r1 = v[0]; 
//r1 = v[1]; // compiler will show error. 

मुझे लगता है कि संदर्भ स्थिरांक r1 पुनः सौंपा नहीं किया जा सकता समझते हैं। लेकिन नीचे दिए गए कोड देखें:

for (const int &r2 : v) cout << r2; 

यह गलत क्यों नहीं होगा? संदर्भ कॉन्स r2 दो बार असाइन किया गया है, है ना?

+0

इसे वी [0], फिर v [1] को सौंपा गया है, है ना? –

+6

'(int k = 0; k <2; k ++) {const int & r1 = v [k];} की अनुमति क्यों है? – immibis

+2

@immibis मैंने पढ़ा कि जैसे यह एक [कोन] था (https: //en.wikipedia।संगठन/विकी/के% सी 5% 8 डीन), और प्रबुद्ध था। :) – Numeri

उत्तर

35

नहीं, इसे दो बार असाइन नहीं किया गया है। r2 पुनरावृत्ति के अंत तक पुनरावृत्ति (लूप बॉडी पर एक राउंड) की शुरुआत से मौजूद है। अगले पुनरावृत्ति में r2 एक ही नाम से एक और वस्तु है। प्रत्येक पुनरावृत्ति का अपना r2 होता है और उनमें से प्रत्येक को अलग से प्रारंभ किया जाता है।

+0

लेकिन 'आर 2' एक कॉन्स है। पुस्तक मैंने पढ़ी है कि 'आर 2' एक निम्न स्तरीय आधार है, जिसका मूल्य बदला नहीं जा सकता है। क्या मैं सही हू? –

+0

@XunChenlong कृपया टिप्पणी करने से पहले उत्तर को अधिक सावधानी से पढ़ें। जवाब पहले से ही आपकी टिप्पणी को संबोधित करता है। :) – hvd

+7

@ एचवीडी ओह, मुझे मिल गया। एक पुनरावृत्ति का मतलब है एक लूप। मैंने इसे पूरे कथन के रूप में गलत समझा। यह मदद करता है। मेरे गरीब अंग्रेजी के लिए खेद है और धन्यवाद! –

6

लेकर आधारित for इस तरह दिखता है:

के लिए attr (वैकल्पिक) (range_declaration: range_expression) loop_statement

जहां range_declaration

range_declaration है - एक एक नामित चर की घोषणा, जिसका प्रकार अनुक्रम के तत्व का प्रकार है range_expression द्वारा, या उस प्रकार का संदर्भ। अक्सर स्वचालित प्रकार की कटौती

तो प्रत्येक पुनरावृत्ति एक नई घोषणा पेश की जाती है, संदर्भ केवल अगले लूप पुनरावृत्ति तक मौजूद है।

24

के अनुसार सी ++ 11 मानक [stmt.ranged]:

{ 
    auto && __range = (v); 
    for (auto __begin = __range.begin(), __end = __range.end(); __begin != __end; ++__begin) 
    { 
     const int &r2 = *__begin; // <-- new variable in each iteration 
     std::cout << r2; 
    } 
} 

Demo

:

for (const int &r2 : v) std::cout << r2; 

जहां ¹ v एक vector है, के बराबर है

संदर्भ कास्ट r2 दो बार सौंपा गया है, है ना?

नंबर एक नईr2 प्रत्येक चरण में चर नहीं है।


आधारित for रेंज ¹ भी संग्रह के अन्य प्रकार कच्चे सारणियों सहित के साथ प्रयोग किया जा सकता है। यहां दिया गया समकक्ष यह है कि सामान्य समतुल्य std::vector के लिए बन जाता है।

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

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