捕获的变量隐藏了lambda中传递的变量.如何解除隐藏
captured variable hides passed variable in lambda. how to unhide?
考虑这个例子:
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。
(很抱歉我不能像你要求的那样参考标准-我没有)
相关文章:
- C++继承模板类:隐藏成员变量
- 在C 中本地声明隐藏的封闭范围(而非全局)中访问变量
- 隐藏的成员变量不应在仅允许const访问的基类中突变,以便保留分配运算符
- 局部变量如何隐藏全局变量
- 双向量隐藏变量
- 编译器不应该对派生类中隐藏的基本结构的成员变量发出警告吗?
- 隐藏子类中的变量
- Visual studio调试工具提示-隐藏变量
- 如何向调试器隐藏变量/函数名
- 为什么局部变量不隐藏数组定义中的全局变量
- 类中的函数,该函数乘以2个隐藏变量
- 类型名称路径由一个静态变量隐藏
- 隐藏 c++ 源文件中变量的可见性
- 在 c++ 中隐藏 int 变量的名称
- C++通过继承隐藏变量
- 如何在dll导出的类中隐藏成员变量
- 捕获的变量隐藏了lambda中传递的变量.如何解除隐藏
- 在g++中我可以访问哪些其他隐藏变量(使用宏预先定义的)?
- g++4.8在gdb中隐藏变量
- 是否有一种方法来隐藏变量在cout (c++)