6

我有以下代码

#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++ 10g++ 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)内显式创建新变量?

g++ 4.5代码编译得很好。标准(n3000 草案)是否对此有任何说明?(我目前没有 C++-0x(1x ?) 标准的副本)

4

4 回答 4

15

您是否真的尝试过编译问题中的代码?Visual C++ 2010 按原样接受代码(显然删除了注释),并成功编译代码而没有错误。

您看到的“错误”不是编译错误,而是 IntelliSense 错误。IntelliSense 错误检查会导致大量误报(我在过去几个月中报告了 Microsoft Connect 上的几个错误);在这种情况下,IntelliSense 错误地说这是一个错误,而实际上它不是。

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

无论哪种方式,这些 IntelliSense 错误都不会阻止编译成功。

于 2010-07-11T05:18:29.627 回答
1

无论 VC 是对还是错,在(外部)lambda 之外声明 sum 都是不好的风格。由于您返回 sum 的值,因此无需更改循环内外部变量的值。相反,您应该拥有:

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

嵌套的 lambda 也可能使 VC 感到困惑。我会说嵌套 lambdas 有点矫枉过正,并且会导致代码的可读性降低。

于 2010-07-11T02:09:01.907 回答
0

我认为您可能必须明确声明关闭 over sum,如下所示:

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

通常,您应该被允许在本地范围内隐式捕获变量,但前提是保证 lambda 在同一范围内运行。可能是因为您将 lambda 分配给一个函数 var 并稍后执行它(而不是直接运行它),MSVC 不够聪明,无法理解该条件成立 - 毕竟,您可能会l在某些情况下传递并执行它其他范围 - 因此它需要显式捕获声明。

于 2010-07-09T08:53:09.843 回答
0

我认为您遇到的唯一问题是蚂蚁大小的红色波浪......因为微软早些时候发布了编译器,很快标准机构确实改变了名称查找的规则......所以智能感知不是最新的...... ……

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

#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();
}
于 2010-07-22T22:17:37.813 回答