ho a che fare con un po 'di codice C che prende alcuni dati, e l'inoltra alla funzione passata:I miei parametri lambda ombreggiano davvero la mia gente del posto?
void foo(int* data, void (*fun)(int*)){
(*fun)(data);
};
I seguenti lavori senza preavviso:
void bar(int* data){};
int main(){
int data=0;
foo(&data,bar);
}
Tuttavia, se uso un lambda invece:
int main(){
int data=0;
foo(&data,[](auto data){});
}
ottengo il seguente avvertimento:
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;
Ma ho pensato che un gruppo di acquisizione vuoto avrebbe escluso la prima istanziazione durante la sua ricerca.
Questo avviso è legittimo?
Perché la cattura vuota non è sufficiente per evitare avvisi?
Penso che l'avviso sia solo lì per avvertirti che potresti aver pensato che stavi usando 'data' e non' data'. Non sa quale sia il tuo * intento *. – vu1p3n0x
Il _name_ è effettivamente ombreggiato. Non è necessario acquisire un simbolo per utilizzare il suo nome, ad es. in un contesto non valutato come 'decltype'. – ildjarn
Almeno in Visual Studio 2015 * non è possibile * utilizzare i simboli in un contesto non valutato (anche decltype (data) o sizeof (dati) non riescono con un errore 'C2065: 'identificativo non dichiarato' dati ') –