2014-11-21 82 views
2

在VS 2015年考虑这段代码:为什么非捕获的变量会引发警告?

int a,b; 

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

为什么a拉姆达给予警告等?它在VS2013中编译得很好。

编辑:有趣的是,(和不正确的),下面是不是在VS2013的错误:

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

我不确定后一种情况应该是错误的。前者看起来像是一个编译器bug。 – user2079303 2014-11-21 10:01:24

回答

3

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

第二个不是一个错误,因为你声明它在不同的范围。该变量仅被捕获,并未被捕获声明。

想想函数对象,这可能产生

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

    void operator()() { 
    int a; 
    } 

    int a; 
}; 

还有的a这两个声明之间没有冲突,因为拉姆达编译成这样的事情,这就是为什么捕获不关心内宣言。

更新:这事从

void foo(int a) { 
    int a; 
} 

完全不同,因为在拉姆达的情况下,它会被编译成类的operator(),并捕获会获得通过作为构造函数的参数这就是为什么他们处于不同的范围。

+0

是'void foo(int a){float} a; }如果编译器允许,不是bug? – Ajay 2014-11-21 10:06:02

+0

@Ajay我更新了我的答案,使其更清晰 – 2014-11-21 10:10:56

+0

基本功能与lambda完全不同。如果它仍然不清楚,请不要问,我会更新答案与更多细节:) – 2014-11-21 10:14:56

相关问题