2014-11-21 68 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

相關問題