2010-09-11 12 views
7

Visual C++ 2010 kabul eder:"Her" için Microsoft belirli mi?

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; 

bu bir C++ 11 özellik veya Microsoft uzantısı mı? , C sözdizimi ++ 11 en for-her biri farklı döngü Wikipedia göre: mevcut standart taslağı for each (auto i in v) sözdizimi içermez

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

Her "taşınabilirlik" için olası [Visual C++ "kopyasının (http://stackoverflow.com/questions/197375/visual-c-for-each-portability) – kennytm

cevap

16

, sadece for (auto i : myints), yani evet, bu sadece bir uzantısıdır. Bir C++ 0x standart konformal sürümü yukarıda sunulan döngüler için versiyonunun yanında

3

da olacaktır:

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

size sunulan var yapı, aynı zamanda standart konformal, ancak farklı standardına uygundur: ECMA C++/CLI belirtimi.

+1

Söylediyse; yerel kod, C++/Cli yerine C++ olmaz mı? Yoksa yanılıyor mu? Yoksa yanılıyor muyum? –

+5

Teknik olarak, "C++ 0x standardı" bir oksmorondur. Henüz bir standart değil. (Ve bir tane olduğunda, artık C++ 0x olarak adlandırılamaz);) – jalf

+0

@jalf Peki, bunun için daha iyi bir isme sahip olmadığımız için, bence en iyisi ... Johannes Hayır, bu her zaman IL'ye veya IL ve yerel kodun gizemli karışımına derler. Bu sözdizimi yalnızca CLR desteğini (/ clr seçeneği) derlediyseniz işe yarayabilir. –

4

VS2010'da, bu tür bir şüphe için, IDE proje ayarlarında "C/C++->Language" altındaki /Za bayrağını deneyin.

Sorunuz gibi, evet, bu standart C++ sözdizimi değil.

+0

Indeed/Za ile birlikte bir derleyici hatası alıyorum. – George

3

Ayrıca Microsoft'un "her" için bir döngüsünün dikkat edilmesi gerektiğini de belirtmek isterim; std :: vector gibi STL kapsayıcılarını kullanarak, değişkenleri yalnızca değer ve const referansı ile referans olarak geçiremezsiniz. Örneğin:

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; 

Derleyiciniz bunun yerine kullanacağım için C++ 0x aralık tabanlı destekliyorsa. Aksi takdirde, BOOST_FOREACH veya std :: for_each işlevini, bir taşınabilir nesneyle veya lambda ile kullanıyorum. Ne yaparsanız yapın, Microsoft'un “her biri için” net bir şekilde uzak durun.

+0

her biri için (const int & x in mvt) 'çalışmaları ve '' const_cast '' i kullanarak öğeyi düzenlenebilir hale getirebilirsiniz. – dmjalund

İlgili konular