【问题标题】:Is "for each" Microsoft specific?“针对每个”微软是特定的吗?
【发布时间】:2010-09-11 10:09:13
【问题描述】:

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

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

【问题讨论】:

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    在 VS2010 中,如有任何此类疑问,请尝试使用 IDE 项目设置中 "C/C++-&gt;Language" 下的 /Za 标志。

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

    【讨论】:

      【解决方案3】:

      除了上面介绍的 for 循环版本之外,c++0x 标准保形版本也将是:

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

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

      【讨论】:

      • 如果真的如他所说,编译成native代码,不就是C++而不是C++/Cli吗?还是他错了?还是我错了?
      • 从技术上讲,“C++0x 标准”是矛盾的。这还不是一个标准。 (而且当它合二为一时,它就不再被称为 C++0x);)
      • @jalf 好吧,因为我们还没有更好的名字,所以我认为这是最好的...... @Johannes 不,这总是编译为 IL,或者那个神秘的混合物IL 和本机代码。只有在使用 CLR 支持(/clr 选项)进行编译时,此语法才有效。
      • 我必须从上面更正我的评论。对于 vc9 和 vc10,此语法也可以在本机代码中编译。这不应该,应该需要 /clr 选项。
      • 我知道,只是有点迂腐。 ;)(虽然我会说“C++0x 符合”,没有“标准”。或者只是“C++0x 版本”
      【解决方案4】:

      我还要注意微软的“for each”循环;使用诸如 std::vector 之类的 STL 容器,您不能通过引用传递变量,只能通过值和 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 一起使用,因为它们是可移植的。无论你做什么,都要远离微软的“for each”。

      【讨论】:

      • 使用for each (const int &amp; x in mvt) 有效,您可以使用const_cast 使项目可编辑
      猜你喜欢
      • 2011-02-21
      • 2013-08-14
      • 2010-09-24
      • 1970-01-01
      • 2021-02-19
      • 2013-05-25
      • 2014-12-07
      • 2018-11-04
      • 1970-01-01
      相关资源
      最近更新 更多