Meus parâmetros lambda estão realmente sombreando meus habitantes locais?

Estou lidando com algum código C que pega alguns dados e o encaminha para a função passada:

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

O seguinte funciona sem aviso:

void bar(int* data){};

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

No entanto, se eu usar um lambda:

int main(){

  int data=0;
  foo(&data,[](auto data){});
}

Recebo o seguinte aviso:

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;

Mas eu pensei que um grupo de captura vazio excluiria a primeira instanciação durante a pesquisa.

Esse aviso é legítimo?
Por que a captura vazia não é suficiente para evitar avisos?

questionAnswers(2)

yourAnswerToTheQuestion