Tre*_*key 7 c++ lambda gcc clang compiler-warnings
我正在处理一些带有一些数据的C代码,并将它转发给传入的函数:
void foo(int* data, void (*fun)(int*)){
(*fun)(data);
};
Run Code Online (Sandbox Code Playgroud)
以下工作没有警告:
void bar(int* data){};
int main(){
int data=0;
foo(&data,bar);
}
Run Code Online (Sandbox Code Playgroud)
但是,如果我使用lambda代替:
int main(){
int data=0;
foo(&data,[](auto data){});
}
Run Code Online (Sandbox Code Playgroud)
我收到以下警告:
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;
Run Code Online (Sandbox Code Playgroud)
但我认为一个空的捕获组会在查找期间排除第一个实例化.
这个警告合法吗?
为什么空捕获不足以避免警告?
lambda 封闭范围中的名称也在 lambda 范围内。
未被捕获的名称仍然可以使用,只要它们不是odr-used。仅必须捕获odr 使用的变量。例子:
#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;
});
}
Run Code Online (Sandbox Code Playgroud)
因为读取常量表达式不是odr-use,所以这段代码是正确的并且data引用了 中的变量main。
这个程序会输出0,但是如果你改成int baz,int data它就会输出5。