¿Mis parámetros lambda realmente sombrean a mis locales?

Estoy tratando con un código C que toma algunos datos y los reenvía a la función pasada:

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

Lo siguiente funciona sin previo aviso:

void bar(int* data){};

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

Sin embargo, si uso una lambda en su lugar:

int main(){

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

Me sale la siguiente advertencia:

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;

Pero pensé que un grupo de captura vacío excluiría la primera instancia durante su búsqueda.

¿Es legítima esta advertencia?
¿Por qué la captura vacía no es suficiente para evitar advertencias?

Respuestas a la pregunta(2)

Su respuesta a la pregunta