为什么非捕获变量会引发警告?

时间:2014-11-21 09:50:09

标签: c++ visual-studio-2015 lambda

在VS 2015

中考虑此代码
int a,b;

[]
{
    int a;  //  C4456: declaration of 'a' hides previous local declaration
}; 

为什么lambda中的a会发出警告?它在VS2013中编译得很好。

编辑:有趣的是,(并且错误地),以下不是VS2013中的错误:

 [a]
 {        
     int a; // No error, even if `a` is captured.
     a++;
 };

1 个答案:

答案 0 :(得分:3)

第一个警告肯定看起来像编译器错误。

第二个不是一个错误,因为你在另一个范围内声明它。该变量仅被捕获,捕获不会声明。

考虑一下这个可以生成的函数对象

class foo {
  foo(int a): a(a) {}

  void operator()() {
    int a;
  }

  int a;
};

a的两个声明之间没有冲突,因为lambda编译成这样的东西,这就是为什么捕获并不关心内部声明。

更新:这与

完全不同
void foo(int a) {
  int a;
}

因为在lambda的情况下,它将被编译为具有operator()的类,并且捕获将作为构造函数参数传递,这就是他们在不同范围内的原因。