Eine leere lambda Erfassungsliste []
erstellt eine einfache Funktion ohne ein Schließobjekt. Warum dann gegeben, dieses Beispiel:Empty Lambda Capture Schatten noch äußeren Umfang?
int main(int argc, const char *argv[]) {
auto _foo = [] (int argc) {
return argc - 1;
};
return _foo(argc);
}
tut gcc (4.8.5 und 5.4.0) warnen, dass die argc
der Lambda-Schatten die argc
Größe des äußeren Umfangs?
In lambda function:
warning: declaration of ‘int argc’ shadows a parameter [-Wshadow]
auto _foo = [] (int argc) {
^
note: shadowed declaration is here
int main(int argc, const char *argv[]) {
^
Schließlich gibt es keinen äußeren/umgebenden Schließzustand, der beschattet werden könnte.
Nicht sicher bin ich damit einverstanden. Eine Warnung sollte über mögliche Probleme sein, wie ein mit vorzeichenloser Ganzzahl vorzeichenbehafteter Vergleich. Wenn hier die Lesbarkeit von Bedeutung ist, dann ist dies * höchstens eine Anmerkung. Das Deklarieren einer Funktion mit denselben Argumentnamen verursacht auch keine Warnung. – Jens
@jens shadowing a varaille verursacht kein tatsächliches Problem. Es ist gut definiert in dem, was es tut. Der Code sieht nicht mehr so aus, als wenn er das Shadowing bemerkt. Deshalb gibt es eine Warnung. – Yakk
Ich stimme der Abschattung grundsätzlich zu. Was ich sagen will, ist, dass mit einem leeren Verschluss '[]' kein äußeres 'argc' vorhanden ist, das möglicherweise beschattet werden könnte. Wenn der Abschluss den äußeren "argc" enthalten würde, dann würde der Parameter - möglicherweise unbeabsichtigter - Schatten sein, in welchem Fall eine Warnung gerechtfertigt wäre. Der obige Code ist eine reine Funktion * ohne * Schlusskontext und somit * ohne * alles, was beschattet werden könnte. – Jens