6

考虑这个例子:

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

4

3 回答 3

7

我在标准中找不到与 lambdas 相关的任何内容,表明您的结果是预期的行为。我同意安迪的评论,即这是 GCC 中的一个错误。Linux 上的 GCC 4.7.2、MinGW 的 GCC 4.7.2 和 MinGW 的 GCC 4.8.0 产生与问题相同的结果,但 VC++10 和 VC++11 产生了预期的结果。

您应该考虑提交错误报告

于 2013-05-28T18:27:45.920 回答
3

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

于 2013-05-28T17:50:20.323 回答
1

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

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

您要么更改其中一个变量的名称,要么不更改。

你的 lambda 也是如此。

(很抱歉,我无法像您要求的那样参考标准 - 我没有。)

于 2013-05-28T17:38:43.990 回答