«Для каждого» Microsoft специфична? - PullRequest
7 голосов
/ 11 сентября 2010

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;

Это функция C ++ 11 или расширение Microsoft?Согласно Википедии , синтаксис C ++ 11 для каждого цикла отличается:

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

Ответы [ 4 ]

16 голосов
/ 11 сентября 2010

Текущий стандартный черновик не включает синтаксис for each ( auto i in v ), только for ( auto i : myints ), так что да, это просто расширение.

4 голосов
/ 11 сентября 2010

В VS2010, для любого такого сомнения, попробуйте с флагом /Za в "C/C++->Language" в настройках проекта IDE.

Что касается вашего запроса, да, это не стандартный синтаксис C ++.

3 голосов
/ 18 августа 2011

Я также хотел бы отметить предостережение Microsoft о цикле «для каждого»;используя контейнеры STL, такие как std :: vector, вы не можете передавать переменные по ссылке, только по значению и константной ссылке.Например:

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; 

Если ваш компилятор поддерживает C ++ 0x на основе диапазона, я бы использовал это вместо этого.Если нет, я бы использовал BOOST_FOREACH или std :: for_each с функциональным объектом или лямбда-выражением, поскольку они переносимы.Что бы вы ни делали, держитесь подальше от Microsoft "для каждого".

3 голосов
/ 11 сентября 2010

Помимо версии цикла for, представленной выше, стандартная конформная версия c ++ 0x также будет:

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

Представленная вами конструкция также является стандартной конформной, но она соответствует другому стандарту: спецификация ECMA C ++ / CLI.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...