Sind meine Lambda-Parameter wirklich so, dass sie meine Einheimischen beschatten?

Ich habe es mit C-Code zu tun, der Daten aufnimmt und an die übergebene Funktion weiterleitet:

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

Das Folgende funktioniert ohne Vorwarnung:

void bar(int* data){};

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

Allerdings, wenn ich stattdessen ein Lambda verwende:

int main(){

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

Ich erhalte die folgende Warnung:

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;

Aber ich dachte, eine leere Erfassungsgruppe würde die erste Instanziierung während des Suchens ausschließen.

Ist diese Warnung berechtigt?
Warum reicht das leere Capture nicht aus, um Warnungen zu vermeiden?

Antworten auf die Frage(4)

Ihre Antwort auf die Frage