考虑这个例子:
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
答案 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也一样。
(我很抱歉我不能像你要求的那样参考标准 - 我没有。)