2013-05-28 110 views
7

考慮這個例子:捕獲的變量隱藏在lambda中傳遞變量。如何取消隱藏?

int main() 
{ 
    int a = 100; 
    std::cout<<[=,&a](int a,int b){return a+b;}(99,1); 
    return 0; 
} 

輸出爲101,而不是我的100期望。

我不能指定爲[&a,=],因爲它會給出錯誤。

如何避免名稱隱藏並引用參數。我知道更改名稱是選項,但我很好奇。也參照標準,將有助於

編輯: 我使用GCC 4.7.1

編輯:

下面是該演示的ideone鏈接。我用C++ 4.7.2編譯器
ideone

+3

你就不能重命名** **參數和外部局部變量的一個? – 2013-05-28 17:33:40

+1

是的,我已經提到,在我的質疑,但我很好奇,爲什麼可以做到? –

+2

'[&,=]'通過引用**和**傳遞所有變量,並通過同時複製全部變量!這對我來說毫無意義。 – deepmax

回答

7

我無法在標準中找到與lambda相關的任何內容,這表明您的結果是預期的行爲。我同意Andy的評論,認爲這是GCC中的一個錯誤。 Linux上的GCC 4.7.2,MinGW的GCC 4.7.2和MinGW的GCC 4.8.0產生的結果與問題相同,但VC++ 10和VC++ 11產生了預期的結果。

你應該考慮filing a bug report

+0

非常感謝你:) –

1

如何在這裏打印出外部a,但在內部範圍?

int a = 1; 
{ 
    int a = 2; 
    cout << a << endl; 
} 

您可以更改其中一個變量的名稱 - 或者您不需要。

你的lambda也是一樣。

(我很抱歉,我不能引用標準像你這樣的要求 - 我沒有它。)

+0

實際上沒有外部a印刷內部。看到這個問題。如果你需要澄清,請讓我知道 –

+2

哦 - 這真的很奇怪。所以捕獲的'a'正在覆蓋參數'a'。這可能是一個編譯器錯誤? –

3

由於參數沒有範圍,你可以命名,不能使用範圍解決運算符來消除歧義,也不會使用任何其他此類方法。因此,以您想要的方式消除這種情況是不可能的。你只需要不給變量可怕和衝突的名字。

+0

我同意,但這是我在調試我的代碼時在不知不覺中遇到的事情。但即使如此,我相信該參數會隱藏捕獲的變量。我已經改變了我的代碼,但非常好奇。 –