“为每个”微软具体吗?

时间:2010-09-11 10:09:13

标签: c++ syntax foreach c++11

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扩展?根据{{​​3}},C ++ 11 for-each循环的语法不同:

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

4 个答案:

答案 0 :(得分:16)

当前的标准草稿不包含for each ( auto i in v )语法,只包含for ( auto i : myints ),所以是的,它只是一个扩展名。

答案 1 :(得分:4)

在VS2010中,对于任何此类疑问,请尝试使用IDE项目设置中/Za下的"C/C++->Language"标记。

至于您的查询,是的,这不是标准的C ++语法。

答案 2 :(得分:3)

除了上面提到的for循环版本,c ++ 0x标准的保形版本也将是:

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

您提供的构造也是标准的保形,但它符合不同的标准:ECMA C ++ / CLI规范。

答案 3 :(得分:3)

我还要注意微软“为每个”循环提出的警告;使用诸如std :: vector之类的STL容器,不能通过引用传递变量,只能通过value和const引用。例如:

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与函数对象或lambda一起使用,因为它们是可移植的。无论你做什么,都要远离微软的“为每个人”。