代码之家  ›  专栏  ›  技术社区  ›  Prasoon Saurav

lambda表达式(MSVC++与g++)

  •  6
  • Prasoon Saurav  · 技术社区  · 14 年前

    我有以下代码

    #include <algorithm>
    #include <iostream>
    #include <vector>
    #include <functional>
    
    
    int main()
    {
      typedef std::vector<int> Vector; 
      int sum=0;
      Vector v;
      for(int i=1;i<=10;++i)
         v.push_back(i);
    
      std::tr1::function<double()>  l=[&]()->double{
    
        std::for_each(v.begin(),v.end(),[&](int n){sum += n; //Error Here in MSVC++});
        return sum;
         };
    
      std::cout<<l();
      std::cin.get();
    }
    

    上面的代码在 MSVC++ 10 但是它编译得很好 g++ 4.5 . 产生的错误是 1 IntelliSense: invalid reference to an outer-scope local variable in a lambda body c:\users\super user\documents\visual studio 2010\projects\lambda\lambda.cpp 19 46 lambda

    那么,有没有其他方法可以访问外部范围变量 sum 没有在局部lambda表达式中显式创建新变量(内部 std::for_each

    代码编译得很好。 标准(N3000草案)是否有任何说明?(我目前没有一份C++ -0x(1x)标准)

    4 回复  |  直到 12 年前
        1
  •  15
  •   James McNellis    14 年前

    你真的试过编译问题中的代码吗?Visual C++ 2010接受代码(如注释明显删除),并成功编译代码而不出错。

    您有两个选项:可以忽略IntelliSense误报,也可以禁用IntelliSense错误检查(右键单击错误列表窗口并取消选中“显示IntelliSense错误”)。

        2
  •  1
  •   Neil Mayhew    14 年前

    int sum = 0;
    std::for_each(v.begin(),v.end(),[&](int n){sum += n;});
    return sum;
    

    可能是嵌套的lambda也让VC感到困惑。我想说,嵌套lambda太过分了,代码可读性较差。

        3
  •  0
  •   tzaman    14 年前

    我想你可能得明确宣布结束 sum ,就像这样:

    std::for_each(v.begin(),v.end(),[&sum](int n){sum += n;});
    

    l 并在其他范围内执行它—因此它需要显式的捕获声明。

        4
  •  0
  •   perilbrain    14 年前

    我想你唯一的问题是蚂蚁大小的红波。。。。 因为微软很早就发布了编译器,很快标准机构就改变了名称查找的规则……所以intellisense不是最新的。。。。。。。。

    所以试着用这个想法打…宝贝。。。

    #include <algorithm>
    #include <iostream>
    #include <vector>
    #include <functional>
    
    
    int main()
    {
      typedef std::vector<int> Vector; 
      int sum=0;
      Vector v;
      for(int i=1;i<=10;++i)
         v.push_back(i);
    
      std::tr1::function<double()>  l=[&]()->double{
          int *y; y=&sum;
          std::for_each(v.begin(),v.end(),[&](int n){*y += n; });
        return sum;
         };
    
      std::cout<<l();
      std::cin.get();
    }