我的lambda参数真的影响了我的当地人吗?

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)

但我认为一个空的捕获组会在查找期间排除第一个实例化.

这个警告合法吗?
为什么空捕获不足以避免警告?

M.M*_*M.M 4

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 bazint data它就会输出5