在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++;
};
答案 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()
的类,并且捕获将作为构造函数参数传递,这就是他们在不同范围内的原因。