捕获的变量隐藏了lambda中传递的变量.如何解除隐藏

captured variable hides passed variable in lambda. how to unhide?

本文关键字:隐藏 变量 何解 lambda      更新时间:2023-10-16

考虑这个例子:

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

我在标准中找不到任何与lambda相关的东西,表明您的结果是预期的行为。我同意Andy的评论,这是GCC中的一个bug。Linux上的GCC 4.7.2, MinGW上的GCC 4.7.2, MinGW上的GCC 4.8.0产生的结果与问题相同,但vc++ 10和vc++ 11产生的结果与预期的相同。

你应该考虑提交一个bug报告

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

我如何在这里打印出外部a,但在内部范围内?

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

你要么改变其中一个变量的名字,要么不改变。

同样适用于lambda。

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