我正在处理一些 C 代码,它获取一些数据,并将其转发到传入的函数:
void foo(int* data, void (*fun)(int*)){
(*fun)(data);
};
以下内容在没有警告的情况下工作:
void bar(int* data){};
int main(){
int data=0;
foo(&data,bar);
}
但是,如果我使用 lambda 代替:
int main(){
int data=0;
foo(&data,[](auto data){});
}
我收到以下警告:
warning: declaration of ‘data’ shadows a previous local [-Wshadow]
foo(&data,[](auto data){});
^
o.cpp:14:7: note: shadowed declaration is here
int data=0;
但我认为空的捕获组会在查找过程中排除第一个实例化。
这个警告合法吗?
为什么空捕获不足以避免警告?
lambda 封闭范围中的名称也在 lambda 范围内。
未被捕获的名称仍然可以使用,只要它们不被捕获odr-used. Only odr-used必须捕获变量。例子:
#include <iostream>
template<typename T> void foo(const int *, T f) { std::cout << f(5) << '\n'; }
int main()
{
const int data=0;
foo(&data,[](int baz){
return data;
});
}
因为读取常量表达式不是odr-use,这段代码是正确的并且data
指的是变量main
.
该程序输出0
,但如果你改变int baz
to int data
,它输出5
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)