2013-05-28 113 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

我同意,但这是我在调试我的代码时在不知不觉中遇到的事情。但即使如此,我相信该参数会隐藏捕获的变量。我已经改变了我的代码,但非常好奇。 –