2016-09-26 2 views
0

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.

Antwort

1

Es ist eine Warnung. Der Code innerhalb des Lambda könnte die Leser darüber verwirren, welche Variable verwendet wird.

Die Warnung ist nicht über schlechtes Verhalten, nur unlesbarer Code, und die Tatsache, dass es ein nicht erfassendes Lambda ist, macht den Code nicht wirklich lesbarer.

Die Regeln für die Spiegelung von Variablen in einem inneren Bereich sind für die Regeln für ein nicht erfassendes Lambda und einen gleichnamigen Parameter ebenso klar, und die Warnung besteht aus dem gleichen Grund.

+1

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

+0

@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

+0

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

Verwandte Themen