2010-09-11 7 views
7

Visual C++ 2010 स्वीकार करता है:"प्रत्येक के लिए" माइक्रोसॉफ्ट विशिष्ट है?

std::vector<int> v; 
v.push_back(1); 
v.push_back(2); 
v.push_back(3); 
for each (auto i in v) 
    std::cout << i << std::endl; 

इस एक सी ++ 11 सुविधा या Microsoft विस्तार है? Wikipedia के अनुसार, सी की वाक्य रचना ++ 11 के लिए-प्रत्येक पाश अलग की:

int myint[] = {1,2,3,4,5}; 
for (int& i: myint) 
{ 
    std::cout << i; 
} 
+3

प्रत्येक "पोर्टेबिलिटी] के लिए [विज़ुअल सी ++" का संभावित डुप्लिकेट (http://stackoverflow.com/questions/197375/visual-c-for-each-portability) – kennytm

उत्तर

16

वर्तमान मानक मसौदा for each (auto i in v) वाक्य रचना शामिल नहीं है, केवल for (auto i : myints), तो हाँ, यह सिर्फ एक विस्तार है।

3

एक C++ 0x मानक कोन्फोर्मल संस्करण ऊपर प्रस्तुत छोरों के लिए संस्करण के अलावा भी होगा:

std::for_each (v.begin(), v.end(), [] (int)->void { 
    std::cout << i << std::endl; 
}); 

निर्माण आप प्रस्तुत किया है, यह भी मानक कोन्फोर्मल है, लेकिन यह अलग मानक के अनुरूप है: ईसीएमए सी ++/सीएलआई विनिर्देश।

+1

यदि ऐसा कहा जाता है, तो यह संकलित करता है देशी कोड, क्या यह सी ++/क्ली के बजाय सी ++ नहीं होगा? या वह गलत है? या मैं गलत हूँ? –

+5

तकनीकी रूप से, "सी ++ 0x मानक" एक ऑक्सीमोरोन है। यह अभी तक एक मानक नहीं है। (और जब यह एक हो जाता है, तो इसे अब सी ++ 0x नहीं कहा जाएगा); – jalf

+0

@jalf Well, क्योंकि हमारे पास अभी तक इसका बेहतर नाम नहीं है, मुझे लगता है कि एक सबसे अच्छा उपलब्ध है ... @ जोहान्स नो, यह हमेशा आईएल, या आईएल और देशी कोड के रहस्यमय मिश्रण के लिए संकलित करता है। यह वाक्यविन्यास केवल तभी काम कर सकता है, यदि आप सीएलआर समर्थन (/ clr विकल्प) के साथ संकलित करते हैं। –

4

वीएस -2010 में, इस तरह के किसी भी संदेह के लिए, आईडीई परियोजना सेटिंग्स में "C/C++->Language" के तहत /Za ध्वज के साथ प्रयास करें।

आपकी क्वेरी के लिए, हाँ, यह मानक सी ++ वाक्यविन्यास नहीं है।

+0

दरअसल, ज़ेड के साथ मुझे लूप पर एक कंपाइलर त्रुटि मिलती है। – George

3

मैं माइक्रोसॉफ्ट के "प्रत्येक के लिए" लूप की चेतावनी भी नोट करना चाहता हूं; एसटीएल कंटेनर जैसे std :: वेक्टर का उपयोग करके, आप केवल संदर्भ और संदर्भ संदर्भ द्वारा संदर्भ द्वारा वेरिएबल पास नहीं कर सकते हैं। उदाहरण के लिए:

int myarr [] = {4, 6, 8, 10, 12, 15}; 
std::vector<int> mvt (myarr, myarr+6); 

for each (int & x in mvt) //will not compile for reasons unbeknownst to those outside MS 
    x+= 4; 

यदि आपका कंपाइलर सी ++ 0x श्रेणी-आधारित का समर्थन करता है, तो मैं इसके बजाय इसका उपयोग करता हूं। यदि नहीं, तो मैं BOOST_FOREACH या std :: for_each का उपयोग फ़ंक्शन ऑब्जेक्ट या लैम्ब्डा के साथ करता हूं क्योंकि ये पोर्टेबल हैं। आप जो कुछ भी करते हैं, माइक्रोसॉफ्ट के "प्रत्येक के लिए" से स्पष्ट रहें।

+0

' प्रत्येक के लिए (कॉन्स int और x mvt में) 'काम करता है और आइटम को संपादन योग्य बनाने के लिए आप' const_cast' का उपयोग कर सकते हैं – dmjalund

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