2010-09-11 11 views
7

Visual C++ 2010 acepta:¿Es "específico para Microsoft" para cada uno?

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; 

¿Es esta una característica de C++ 11 o una extensión de Microsoft? De acuerdo con Wikipedia, la sintaxis de C++ de 11-para cada bucle diferente:

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

posible duplicado de [Visual C++ "para cada" portabilidad] (http://stackoverflow.com/questions/197375/visual-c-for-each-portability) – kennytm

Respuesta

16

El borrador de la norma actual no incluye la sintaxis for each (auto i in v), sólo el for (auto i : myints), así que sí, es sólo una extensión.

3

Además de la versión para los bucles presentado anteriormente una versión de conformación estándar de C++ 0x También sería:

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

El constructo que ha presentado, es también conforme estándar, pero se ajusta al estándar diferente: La Especificación ECMA C++/CLI.

+1

Si es como él dijo, que se compila para código nativo, ¿no sería C++ en lugar de C++/Cli? ¿O está equivocado? ¿O estoy equivocado? –

+5

Técnicamente, "C++ 0x estándar" es un oxímoron. No es un estándar todavía. (Y cuando se convierta en uno, ya no se llamará C++ 0x);) – jalf

+0

@jalf Bueno, como todavía no tenemos un nombre mejor, creo que esa es la mejor disponible ... @ Johannes No, esto siempre compila a IL, o a esa misteriosa mezcla de IL y código nativo. Esta sintaxis solo puede funcionar, si compila con soporte CLR (opción/clr). –

4

En VS2010, para cualquier duda, intente con el /Za marca bajo "C/C++->Language" en la configuración del proyecto IDE.

En cuanto a su consulta, sí, esto no es la sintaxis estándar de C++.

+0

De hecho, con/Za obtengo un error de compilación en el ciclo. – George

3

También me gustaría notar una advertencia del ciclo "para cada" de Microsoft; utilizando contenedores STL como std :: vector, no puede pasar variables por referencia, solo por valor y referencia constante. Por ejemplo:

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; 

Si su compilador admite C++ 0x basado en el rango, lo usaría en su lugar. De lo contrario, utilizaría BOOST_FOREACH o std :: for_each con un objeto de función o lambda, ya que son portátiles. Hagas lo que hagas, mantente alejado de "para cada uno" de Microsoft.

+0

usando ' para cada (const int & x in mvt) 'funciona y puede usar' const_cast' para hacer que el elemento sea editable – dmjalund

Cuestiones relacionadas