捕获的变量隐藏在lambda中传递变量。怎么取消隐藏?

时间:2013-05-28 17:31:20

标签: c++ c++11

考虑这个例子:

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 个答案:

答案 0 :(得分:7)

我在标准中找不到与lambdas相关的任何内容,表明你的结果是预期的行为。我同意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

答案 1 :(得分:3)

由于参数没有您可以命名的范围,因此您不能使用范围解析运算符来消除歧义,也不能使用this或任何其他此类方法。因此,不可能以您想要的方式消除这种情况的歧义。你只需要不要给你的变量带来可怕的和冲突的名字。

答案 2 :(得分:1)

如何在此处打印外a,但在内部范围?

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

您可以更改其中一个变量的名称 - 或者您不是。

你的lambda也一样。

(我很抱歉我不能像你要求的那样参考标准 - 我没有。)