Ja, die Erfassungen erfolgen an dem Punkt, an dem das Lambda deklariert wird, nicht wenn es aufgerufen wird. Stellen Sie sich ein Lambda als ein Funktionsobjekt vor, dessen Konstruktor die erfassten Variablen als Parameter akzeptiert und sie den entsprechenden Mitgliedsvariablen zuweist (entweder Werte oder Referenzen, abhängig vom Aufnahmemodus). Der eigentliche Aufruf des Lambda hat keine Magie, es ist nur ein regulärer operator()
Aufruf des zugrunde liegenden Funktionsobjekts.
Das Erfassen von Dingen am Call Point würde nicht viel Sinn ergeben - was würde gefangen werden, wenn das Lambda zurückgegeben oder als Parameter an eine andere Funktion übergeben und dort aufgerufen würde? Es gibt tatsächlich Sprachen, die sich so verhalten - wenn Sie in einer Funktion auf eine Variable x
verweisen, wird angenommen, dass sie sich auf eine beliebige Variable namens x
bezieht, die sich zum Zeitpunkt des Aufrufs im Geltungsbereich befindet. Dies wird dynamisches Scoping genannt. Die Alternative, die von den meisten Sprachen verwendet wird, weil sie die Argumentation über Programme vereinfacht, wird als lexikalisches Scoping bezeichnet.
http://en.wikipedia.org/wiki/Lexical_scoping#Lexical_scoping_and_dynamic_scoping
danke. Ich dachte by-Wert, da in Updates auf Wert außerhalb der Funktion nicht sichtbar ist. Es klingt jedoch so, als ob Updates außerhalb der Funktion in der Funktion nicht sichtbar sind. – perreal
Was hier irreführend sein könnte, ist der Wortlaut: Wert bedeutet "eine Kopie erzeugen". Das Lambda hat eine Kopie der Variablen, deren Wert zum Zeitpunkt der Deklaration des Lambda genommen wird. Da das Lambda eine private Kopie hat, wird das ursprüngliche Objekt nicht innerhalb des Lambda geändert oder gelesen. Deshalb gibt es tatsächlich eine Erfassung durch Referenz, um den Fall zu ermöglichen, dass Sie das Original sehen/ändern möchten. – Klaim