2010-09-11 7 views
7

Visual C++ 2010 akzeptiert:Ist "für jeden" Microsoft spezifisch?

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; 

Ist das eine C++ 11-Funktion oder eine Microsoft-Erweiterung? Nach Wikipedia, die Syntax von C++ 11 der for-Schleife jedes andere:

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

mögliche Duplikat von [Visual C++ "für jede" Portabilität] (http://stackoverflow.com/questions/197375/visual-c-for-e-ach-portability) – kennytm

Antwort

16

Die aktuelle Standardentwurf nicht die for each (auto i in v) Syntax enthält, nur die for (auto i : myints), also ja, es ist nur eine Erweiterung.

3

Neben der for-Schleifen-Version über eine C++ 0x-Standard konforme Version vorgestellt wäre auch:

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

Das Konstrukt Ihnen präsentiert haben, ist auch Standard-konformen, aber es passt sich an verschiedene Standard: Die ECMA C++/CLI-Spezifikation.

+1

Wenn es ist wie er sagte, dass es kompiliert Native Code, wäre es nicht C++ statt C++/Cli? Oder liegt er falsch? Oder liege ich falsch? –

+5

Technisch gesehen ist "C++ 0x Standard" ein Oxymoron. Es ist noch kein Standard. (Und wenn es eins wird, heißt es nicht mehr C++ 0x);) – jalf

+0

@jalf Nun, da wir noch keinen besseren Namen dafür haben, denke ich, dass man der beste ist ... @ Johannes Nein, das kompiliert immer zu IL oder zu dieser geheimnisvollen Mischung aus IL und nativem Code. Diese Syntax funktioniert möglicherweise nur, wenn Sie mit CLR-Unterstützung (Option/CLR) kompilieren. –

4

In VS2010, für solche Zweifel, versuchen Sie mit dem /Za Flag unterin den IDE-Projekteinstellungen.

Wie für Ihre Abfrage, ja, das ist nicht Standard-C++ - Syntax.

+0

In der Tat, mit/Za bekomme ich einen Compiler Fehler in der Schleife. – George

3

Ich möchte auch eine Einschränkung von Microsofts "für jede" Schleife beachten; Bei Verwendung von STL-Containern wie std :: vector können Variablen nicht als Referenz übergeben werden, sondern nur als Wert und const-Referenz. Zum Beispiel:

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; 

Wenn Ihr Compiler unterstützt C++ 0x Bereich Basis für mich, dass stattdessen verwenden würde. Wenn nicht, würde ich BOOST_FOREACH oder std :: for_each mit einem Funktionsobjekt oder Lambda verwenden, da diese portierbar sind. Was auch immer Sie tun, bleiben Sie bei Microsofts "für jeden" klar.

+0

mit ' für jeden (const int & x in mvt) 'funktioniert und Sie können' const_cast' verwenden, um das Objekt editierbar zu machen – dmjalund

Verwandte Themen