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;
}
答案 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一起使用,因为它们是可移植的。无论你做什么,都要远离微软的“为每个人”。