Мои параметры лямбды действительно затеняют моих местных жителей?

Я имею дело с кодом C, который берет некоторые данные и передает их функции, переданной в:

void foo(int* data, void (*fun)(int*)){
  (*fun)(data);
};

Следующие работы без предупреждения:

void bar(int* data){};

int main(){
  int data=0;
  foo(&data,bar);
}

Однако, если я использую лямбду вместо:

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;

Но я думал, что пустая группа захвата исключит первое создание во время поиска.

Это предупреждение законно?
Почему пустого захвата недостаточно, чтобы избежать предупреждений?

Ответы на вопрос(2)

Ваш ответ на вопрос